home *** CD-ROM | disk | FTP | other *** search
/ Shareware Overload Trio 2 / Shareware Overload Trio Volume 2 (Chestnut CD-ROM).ISO / dir44 / dungn32.zip / OBJECTS.FOR < prev    next >
Text File  |  1994-10-07  |  98KB  |  2,671 lines

  1. C Object processors for DUNGEON
  2. C
  3. C COPYRIGHT 1980, 1990, INFOCOM COMPUTERS AND COMMUNICATIONS, CAMBRIDGE MA.
  4. C ALL RIGHTS RESERVED, COMMERCIAL USAGE STRICTLY PROHIBITED
  5. C WRITTEN BY R. M. SUPNIK
  6. C
  7. C 29-Sep-94     RMS     Fixed bugs in KILL MASTER, palantir, dial button,
  8. C                       well, slide, bat, global brochure, granite wall,
  9. C                       bottle, leaves, broken lamp, beam, robot, thief,
  10. C                       troll, me, subscripting, object substitution.
  11. C                       Added features to heads, coke bottles, balloon,
  12. C                       bucket, stove.
  13. C 30-Jan-94     RMS     Fixed bugs from MS-DOS port.
  14. C 25-Jan-94     RMS     Added ground = sand at sandy beach.
  15. C 30-Jun-92     RMS     Changed file names to lower case.
  16. C
  17. C OAPPLI- Object action routines
  18. C
  19. C Declarations
  20. C
  21.       LOGICAL FUNCTION OAPPLI(RI,ARG)
  22.       IMPLICIT INTEGER (A-Z)
  23.       INCLUDE 'dparam.for'
  24.       LOGICAL SOBJS,NOBJS
  25.       LOGICAL QOPEN,QON,LIT,WASLIT
  26.       LOGICAL MOVETO,RMDESC,CLOCKD
  27.       LOGICAL THIEFP,CYCLOP,TROLLP,BALLOP
  28.       LOGICAL QEMPTY,F,OPNCLS
  29.       PARAMETER (MXSMP=99)
  30. C
  31. C Functions and data
  32. C
  33.       QOPEN(R)=(OFLAG2(R).AND.OPENBT).NE.0
  34.       QON(R)=(OFLAG1(R).AND.ONBT).NE.0
  35. C
  36.       IF(RI.EQ.0) GO TO 10                      ! zero is false app.
  37.       IF(RI.LE.MXSMP) GO TO 100                 ! simple object?
  38.       ODO2=0
  39.       ODI2=0
  40.       IF((PRSO.NE.0).AND.(PRSO.LE.OMAX)) ODO2=ODESC2(PRSO)
  41.       IF(PRSI.NE.0) ODI2=ODESC2(PRSI)
  42.       AV=AVEHIC(WINNER)
  43.       FLOBTS=FLAMBT+LITEBT+ONBT
  44.       OAPPLI=.TRUE.
  45.       WASLIT=LIT(HERE)
  46. C
  47.       GO TO (2000,5000,10000,11000,12000,15000,18000,
  48.      119000,20000,22000,25000,26000,32000,35000,39000,40000,
  49.      245000,47000,48000,49000,50000,51000,52000,54000,55000,
  50.      356000,57000,58000,59000,60000,61000,62000),
  51.      3(RI-MXSMP)
  52.       CALL BUG(6,RI)
  53. C
  54. C Return here to declare false result.
  55. C
  56. 10    OAPPLI=.FALSE.
  57.       RETURN
  58. C
  59. C Return here to test for light source change.
  60. C
  61. 50    IF(WASLIT.AND..NOT.LIT(HERE)) CALL RSPEAK(406)
  62.       RETURN
  63. C
  64. C Simple objects, processed externally.
  65. C
  66. 100   IF(RI.LT.32) OAPPLI=SOBJS(RI,ARG)
  67.       IF(RI.GE.32) OAPPLI=NOBJS(RI,ARG)
  68.       RETURN
  69.  
  70. C OAPPLI, PAGE 3
  71. C
  72. C O100--        Machine
  73. C
  74. 2000  IF(HERE.NE.MMACH) GO TO 10                ! not here? f
  75.       OAPPLI=OPNCLS(MACHI,123,124)              ! handle opn/cls.
  76.       RETURN
  77. C
  78. C O101--        Water
  79. C
  80. 5000  IF(PRSA.NE.GTHROW) GO TO 5025             ! go through?
  81.       CALL RSPEAK(331+RND(3))                   ! joke.
  82.       RETURN
  83. C
  84. 5025  IF(PRSA.NE.FILLW) GO TO 5050              ! fill x with y is
  85.       PRSA=PUTW                                 ! made into
  86.       I=PRSI
  87.       PRSI=PRSO
  88.       PRSO=I                                    ! put y in x.
  89.       I=ODI2
  90.       ODI2=ODO2
  91.       ODO2=I
  92. 5050  IF((PRSO.EQ.WATER).OR.(PRSO.EQ.GWATE)) GO TO 5100
  93.       CALL RSPEAK(561)                          ! water is ind obj,
  94.       RETURN                                    ! punt.
  95. C
  96. 5100  IF(PRSA.NE.TAKEW) GO TO 5400              ! take water?
  97.       IF(PRSI.NE.0) GO TO 5200                  ! from x?
  98.       IF((OADV(BOTTL).EQ.WINNER).AND.(OCAN(PRSO).NE.BOTTL))
  99.      1GO TO 5500                                ! take, have bottle -> put.
  100.       IF(OCAN(PRSO).NE.BOTTL) GO TO 5150        ! water in bottle?
  101.       IF(OADV(BOTTL).NE.WINNER) GO TO 5125      ! already have bottle?
  102.       CALL RSPEAK(103)                          ! yes, already have water.
  103.       RETURN
  104. C
  105. 5125  PRSO=BOTTL                                ! take bottle.
  106.       GO TO 10                                  ! do normal take.
  107. C
  108. 5150  IF(OCAN(PRSO).EQ.0) GO TO 5300            ! if not inside, take.
  109.       PRSI=OCAN(PRSO)                           ! make into take from.
  110.       GO TO 5250                                ! check for open.
  111. C
  112. 5200  IF(OCAN(PRSO).NE.PRSI) GO TO 5250         ! is it inside?
  113.       CALL RSPEAK(1038)                         ! not in that.
  114.       RETURN
  115. C
  116. 5250  IF(QOPEN(PRSI)) GO TO 5300                ! is it open?
  117.       CALL RSPSUB(525,ODI2)                     ! no, not open.
  118.       RETURN
  119. C
  120. 5300  IF(AV.NE.0) GO TO 5800                    ! if in vehicle, put there.
  121.       I=615                                     ! assume player.
  122.       IF(WINNER.NE.PLAYER) I=1081
  123.       CALL RSPEAK(I)                            ! slips thru fingers.
  124.       RETURN
  125. C
  126. 5400  IF(PRSA.NE.PUTW) GO TO 5700               ! put water in x?
  127.       IF(PRSI.EQ.BOTTL) GO TO 5500              ! in bottle?
  128.       IF(((OFLAG2(PRSI).AND.VEHBT).NE.0).OR.
  129.      1 ((AV.NE.0).AND.(PRSI.EQ.AV))) GO TO 5450 ! in veh?
  130.       CALL RSPSUB(297,ODI2)                     ! wont go elsewhere.
  131.       CALL NEWSTA(PRSO,0,0,0,0)                 ! vanish water.
  132.       RETURN
  133. C
  134. 5450  CALL NEWSTA(WATER,0,0,PRSI,0)             ! water into vehicle.
  135.       CALL RSPSUB(296,ODESC2(PRSI))             ! describe.
  136.       RETURN
  137. C
  138. 5500  IF(QOPEN(BOTTL)) GO TO 5550               ! bottle open?
  139.       CALL RSPEAK(612)                          ! no, lose.
  140.       RETURN
  141. C
  142. 5550  IF(QEMPTY(BOTTL)) GO TO 5600              ! open, empty?
  143.       CALL RSPEAK(613)                          ! no, already full.
  144.       RETURN
  145. C
  146. 5600  CALL NEWSTA(WATER,614,0,BOTTL,0)          ! take water to bottle.
  147.       RETURN
  148. C
  149. 5700  IF((PRSA.NE.DROPW).AND.(PRSA.NE.POURW))
  150.      1GO TO 5900                                ! drop, pour?
  151.       IF(AV.NE.0) GO TO 5800                    ! into vehicle?
  152.       CALL NEWSTA(PRSO,133,0,0,0)               ! no, vanishes.
  153.       RETURN
  154. C
  155. 5800  CALL NEWSTA(WATER,0,0,AV,0)               ! water into his vehicle.
  156.       CALL RSPSUB(296,ODESC2(AV))               ! describe.
  157.       RETURN
  158. C
  159. 5900  IF(PRSA.NE.THROWW) GO TO 10               ! last chance, throw?
  160.       CALL NEWSTA(PRSO,132,0,0,0)               ! vanishes.
  161.       RETURN
  162.  
  163. C OAPPLI, PAGE 4
  164. C
  165. C O102--        Leaf pile
  166. C
  167. 10000 IF(PRSA.NE.BURNW) GO TO 10500             ! burn?
  168.       IF(QOPEN(GRATE).OR.(RVCLR.NE.0)) GO TO 10050
  169.       RVCLR=1                                   ! leaves moved.
  170.       CALL NEWSTA(GRATE,30,HERE,0,0)            ! grating appears.
  171. 10050 IF(OADV(PRSO).EQ.PLAYER) GO TO 10100      ! was he carrying?
  172.       CALL NEWSTA(LEAVE,158,0,0,0)              ! no, burn leaves.
  173.       RETURN
  174. C
  175. 10100 CALL NEWSTA(LEAVE,0,HERE,0,0)             ! drop leaves.
  176.       IF(HERE.EQ.MTREE) CALL NEWSTA(LEAVE,0,FORE3,0,0)
  177.       CALL JIGSUP(159)                          ! burn him.
  178.       RETURN
  179. C
  180. 10500 IF(PRSA.NE.MOVEW) GO TO 10600             ! move?
  181.       CALL RSPEAK(2)                            ! done.
  182. 10550 IF(QOPEN(GRATE).OR.(RVCLR.NE.0)) RETURN   ! done before?
  183.       RVCLR=1                                   ! leaves moved.
  184.       CALL NEWSTA(GRATE,30,HERE,0,0)            ! grating appears.
  185.       RETURN
  186. C
  187. 10600 IF(PRSA.NE.TAKEW) GO TO 10700             ! take?
  188.       OAPPLI=.FALSE.                            ! don't handle here.
  189.       GO TO 10550                               ! make grate visible.
  190. C
  191. 10700 IF((PRSA.NE.LOOKUW).OR.QOPEN(GRATE).OR.(RVCLR.NE.0)) GO TO 10
  192.       CALL RSPEAK(344)                          ! look under?
  193.       RETURN
  194. C
  195. C O103--        Troll, done externally.
  196. C
  197. 11000 OAPPLI=TROLLP(ARG)                        ! troll processor.
  198.       GO TO 50                                  ! go see if now dark.
  199. C
  200. C O104--        Rusty knife.
  201. C
  202. 12000 IF(PRSA.NE.TAKEW) GO TO 12100             ! take?
  203.       IF(OADV(SWORD).EQ.WINNER) CALL RSPEAK(160) ! pulse sword.
  204.       GO TO 10
  205. C
  206. 12100 IF((((PRSA.NE.ATTACW).AND.(PRSA.NE.KILLW)).OR.
  207.      1(PRSI.NE.RKNIF)).AND.
  208.      2 (((PRSA.NE.SWINGW).AND.(PRSA.NE.THROWW)).OR.
  209.      3(PRSO.NE.RKNIF))) GO TO 10
  210.       CALL NEWSTA(RKNIF,0,0,0,0)                ! kill knife.
  211.       CALL JIGSUP(161)                          ! kill him.
  212.       RETURN
  213.  
  214. C OAPPLI, PAGE 5
  215. C
  216. C O105--        Glacier
  217. C
  218. 15000 IF(PRSA.NE.THROWW) GO TO 15500            ! throw?
  219.       IF(PRSO.NE.TORCH) GO TO 15400             ! torch?
  220.       CALL NEWSTA(ICE,169,0,0,0)                ! melt ice.
  221.       ODESC1(TORCH)=174                         ! mung torch.
  222.       ODESC2(TORCH)=173
  223.       OFLAG1(TORCH)=OFLAG1(TORCH).AND. .NOT.FLOBTS
  224.       CALL NEWSTA(TORCH,0,STREA,0,0)            ! move torch.
  225.       GLACRF=.TRUE.                             ! glacier gone.
  226.       IF(.NOT.LIT(HERE)) CALL RSPEAK(170)       ! in dark?
  227.       RETURN
  228. C
  229. 15400 CALL RSPEAK(171)                          ! joke if not torch.
  230.       GO TO 10                                  ! don't handle.
  231. C
  232. 15500 IF((PRSA.NE.MELTW).OR.(PRSO.NE.ICE)) GO TO 10
  233.       IF((OFLAG1(PRSI).AND.FLOBTS).EQ.FLOBTS) GO TO 15600
  234.       CALL RSPSUB(298,ODI2)                     ! cant melt with that.
  235.       RETURN
  236. C
  237. 15600 GLACMF=.TRUE.                             ! partial melt.
  238.       IF(PRSI.NE.TORCH) GO TO 15700             ! melt with torch?
  239.       ODESC1(TORCH)=174                         ! mung torch.
  240.       ODESC2(TORCH)=173
  241.       OFLAG1(TORCH)=OFLAG1(TORCH).AND. .NOT.FLOBTS
  242. 15700 CALL JIGSUP(172)                          ! drown.
  243.       RETURN
  244. C
  245. C O106--        Black book
  246. C
  247. 18000 IF(PRSA.NE.OPENW) GO TO 18100             ! open?
  248.       CALL RSPEAK(180)                          ! joke.
  249.       RETURN
  250. C
  251. 18100 IF(PRSA.NE.CLOSEW) GO TO 18200            ! close?
  252.       CALL RSPEAK(181)
  253.       RETURN
  254. C
  255. 18200 IF(PRSA.NE.BURNW) GO TO 10                ! burn?
  256.       CALL NEWSTA(BOOK,0,0,0,0)                 ! vanish book.
  257.       CALL JIGSUP(182)                          ! fatal joke.
  258.       RETURN
  259.  
  260. C OAPPLI, PAGE 6
  261. C
  262. C O107--        Candles
  263. C
  264. 19000 IF(ORCAND.NE.0) GO TO 19100               ! first ref?
  265.       ORCAND=1                                  ! yes, candles are
  266.       CFLAG(CEVCND)=.TRUE.
  267.       CTICK(CEVCND)=50                          ! burning when seen.
  268. C
  269. 19100 IF(PRSI.EQ.CANDL) GO TO 10                ! ignore ind refs.
  270.       IF(PRSA.NE.TRNOFW) GO TO 19200            ! turn off?
  271.       I=513                                     ! assume off.
  272.       IF(QON(CANDL)) I=514                      ! if on, different.
  273.       CFLAG(CEVCND)=.FALSE.                     ! disable countdown.
  274.       OFLAG1(CANDL)=OFLAG1(CANDL).AND. .NOT.ONBT
  275.       CALL RSPEAK(I)
  276.       GO TO 50                                  ! go see if now dark.
  277. C
  278. 19200 IF((PRSA.NE.BURNW).AND.(PRSA.NE.TRNONW)) GO TO 10
  279.       IF((OFLAG1(CANDL).AND.LITEBT).NE.0) GO TO 19300
  280.       CALL RSPEAK(515)                          ! candles too short.
  281.       RETURN
  282. C
  283. 19300 IF(PRSI.NE.0) GO TO 19400                 ! any flame?
  284.       CALL RSPEAK(516)                          ! no, lose.
  285.       CALL ORPHAN(-1,ACT,PREP1,CANDL,2,' ',0,0) ! orphan "light candle with"
  286.       PRSWON=.FALSE.
  287.       PRSCON=0
  288.       RETURN
  289. C
  290. 19400 IF((PRSI.NE.MATCH).OR. .NOT.QON(MATCH)) GO TO 19500
  291.       I=517                                     ! assume off.
  292.       IF(QON(CANDL)) I=518                      ! if on, joke.
  293.       OFLAG1(CANDL)=OFLAG1(CANDL).OR.ONBT       ! lite candles.
  294.       CFLAG(CEVCND)=.TRUE.                      ! resume countdown.
  295.       CALL RSPEAK(I)
  296.       RETURN
  297. C
  298. 19500 IF((PRSI.NE.TORCH).OR. .NOT.QON(TORCH)) GO TO 19600
  299.       IF(QON(CANDL)) GO TO 19700                ! already on?
  300.       CALL NEWSTA(CANDL,521,0,0,0)              ! no, vaporize.
  301.       RETURN
  302. C
  303. 19600 CALL RSPEAK(519)                          ! cant light with that.
  304.       RETURN
  305. C
  306. 19700 CALL RSPEAK(520)                          ! already on.
  307.       RETURN
  308. C
  309. C O108--        Matches
  310. C
  311. 20000 IF((PRSA.NE.TRNONW).OR.(PRSO.NE.MATCH)) GO TO 20500
  312.       IF(ORMTCH.NE.0) GO TO 20100               ! any matches left?
  313.       CALL RSPEAK(183)                          ! no, lose.
  314.       RETURN
  315. C
  316. 20100 ORMTCH=ORMTCH-1                           ! decrement no matches.
  317.       OFLAG1(MATCH)=OFLAG1(MATCH).OR.FLOBTS
  318.       CFLAG(CEVMAT)=.TRUE.
  319.       CTICK(CEVMAT)=2                           ! countdown.
  320.       CALL RSPEAK(184)
  321.       RETURN
  322. C
  323. 20500 IF((PRSA.NE.TRNOFW).OR.((OFLAG1(MATCH).AND.ONBT).EQ.0))
  324.      1GO TO 10                                  ! extinguish?
  325.       OFLAG1(MATCH)=OFLAG1(MATCH).AND. .NOT.FLOBTS
  326.       CTICK(CEVMAT)=0
  327.       CALL RSPEAK(185)
  328.       GO TO 50                                  ! go see if now dark.
  329. C
  330. C O109--        Cyclops, processed externally.
  331. C
  332. 22000 OAPPLI=CYCLOP(ARG)                        ! cyclops
  333.       GO TO 50                                  ! go see if now dark.
  334. C
  335. C O110--        Thief, processed externally.
  336. C
  337. 25000 OAPPLI=THIEFP(ARG)
  338.       GO TO 50                                  ! go see if now dark.
  339. C
  340. C O111--        Window
  341. C
  342. 26000 OAPPLI=OPNCLS(WINDO,208,209)              ! open/cls window.
  343.       RETURN
  344. C
  345. C O112--        Pile of bodies
  346. C
  347. 32000 IF(PRSA.NE.TAKEW) GO TO 32500             ! take?
  348.       CALL RSPEAK(228)                          ! cant.
  349.       RETURN
  350. C
  351. 32500 IF((PRSA.NE.BURNW).AND.(PRSA.NE.MUNGW)) GO TO 10
  352.       IF(ONPOLF) RETURN                         ! burn or mung?
  353.       ONPOLF=.TRUE.                             ! set head on pole.
  354.       CALL NEWSTA(HPOLE,0,LLD2,0,0)
  355.       CALL JIGSUP(229)                          ! beheaded.
  356.       RETURN
  357. C
  358. C O113--        Vampire bat
  359. C
  360. 35000 CALL RSPEAK(50)                           ! time to fly, jack.
  361.       F=MOVETO(BATDRP(RND(9)+1),WINNER)         ! select random dest.
  362.       F=RMDESC(0)
  363.       PRSCON=0                                  ! disable parser.
  364.       RETURN
  365.  
  366. C OAPPLI, PAGE 7
  367. C
  368. C O114--        Stick
  369. C
  370. 39000 IF(PRSA.NE.WAVEW) GO TO 10                ! wave?
  371.       IF(HERE.EQ.MRAIN) GO TO 39500             ! on rainbow?
  372.       IF((HERE.EQ.POG).OR.(HERE.EQ.FALLS)) GO TO 39200
  373.       CALL RSPEAK(244)                          ! nothing happens.
  374.       RETURN
  375. C
  376. 39200 OFLAG1(POT)=OFLAG1(POT).OR.VISIBT         ! make gold visible.
  377.       RAINBF=.NOT. RAINBF                       ! complement rainbow.
  378.       I=245                                     ! assume off.
  379.       IF(RAINBF) I=246                          ! if on, solid.
  380.       CALL RSPEAK(I)                            ! describe.
  381.       RETURN
  382. C
  383. 39500 RAINBF=.FALSE.                            ! on rainbow,
  384.       CALL JIGSUP(247)                          ! take a fall.
  385.       RETURN
  386. C
  387. C O115--        Balloon, handled externally.
  388. C
  389. 40000 OAPPLI=BALLOP(ARG)
  390.       RETURN
  391. C
  392. C O116--        Heads
  393. C
  394. 45000 IF(PRSA.NE.HELLOW) GO TO 45100            ! hello heads?
  395.       CALL RSPEAK(633)                          ! truly bizarre.
  396.       RETURN
  397. C
  398. 45100 IF((PRSA.NE.KILLW).AND.(PRSA.NE.MUNGW).AND.
  399.      1 (PRSA.NE.RUBW).AND.(PRSA.NE.OPENW).AND.
  400.      2 (PRSA.NE.TAKEW).AND.(PRSA.NE.BURNW).AND.(PRSA.NE.SPINW).AND.
  401.      3 (PRSA.NE.ATTACW).AND.(PRSA.NE.KICKW)) GO TO 10
  402.       CALL RSPEAK(260)                          ! bad news for player
  403.       I=ROBADV(WINNER,0,LCASE,0)+ROBRM(HERE,100,0,LCASE,0)
  404.       IF(I.NE.0) CALL NEWSTA(LCASE,0,LROOM,0,0) ! if robbed, make large case.
  405.       CALL JIGSUP(261)                          ! kill him.
  406.       RETURN
  407.  
  408. C OAPPLI, PAGE 8
  409. C
  410. C O117--        Sphere
  411. C
  412. 47000 IF(CAGESF.OR.(PRSA.NE.TAKEW)) GO TO 47600 ! take?
  413.       IF(WINNER.NE.PLAYER) GO TO 47500          ! robot take?
  414.       CALL RSPEAK(263)                          ! no, drop cage.
  415.       IF(OROOM(ROBOT).NE.HERE) GO TO 47200      ! robot here?
  416.       F=MOVETO(CAGED,WINNER)                    ! yes, move into cage.
  417.       CALL NEWSTA(ROBOT,0,CAGED,0,0)            ! move robot.
  418.       AROOM(AROBOT)=CAGED
  419.       OFLAG1(ROBOT)=OFLAG1(ROBOT).OR.NDSCBT     ! don't describe robot.
  420.       CFLAG(CEVSPH)=.TRUE.
  421.       CTICK(CEVSPH)=10                          ! get out in 10 or else.
  422.       RETURN
  423. C
  424. 47200 CALL NEWSTA(SPHER,0,0,0,0)                ! you're dead.
  425.       RFLAG(CAGER)=RFLAG(CAGER).OR.RMUNG        ! mung cage room.
  426.       RDESC1(CAGER)=147
  427.       CALL JIGSUP(148)                          ! mung player.
  428.       RETURN
  429. C
  430. 47500 CALL NEWSTA(SPHER,0,0,0,0)                ! robot tried,
  431.       CALL NEWSTA(ROBOT,264,0,0,0)              ! kill him.
  432.       CALL NEWSTA(CAGE,0,HERE,0,0)              ! insert mangled cage.
  433.       GO TO 50                                  ! go see if now dark.
  434. C
  435. 47600 IF(PRSA.NE.LOOKIW) GO TO 10               ! look in?
  436.       OAPPLI=NOBJS(OACTIO(PALAN),ARG)           ! do palantir function.
  437.       RETURN
  438. C
  439. C O118--        Geometrical buttons
  440. C
  441. 48000 IF(PRSA.NE.PUSHW) GO TO 10                ! push?
  442.       I=PRSO-SQBUT+1                            ! get button index.
  443.       IF((I.LE.0).OR.(I.GE.4)) GO TO 10         ! a button?
  444.       IF(WINNER.NE.PLAYER) GO TO (48100,48200,48300),I
  445.       CALL JIGSUP(265)                          ! you pushed, you die.
  446.       RETURN
  447. C
  448. 48100 I=267                                     ! square, speed up.
  449.       IF(CAROZF) I=266
  450.       CAROZF=.TRUE.
  451.       CALL RSPEAK(I)
  452.       RETURN
  453. C
  454. 48200 I=266                                     ! round, slow down.
  455.       IF(CAROZF) I=268
  456.       CAROZF=.FALSE.
  457.       CALL RSPEAK(I)
  458.       RETURN
  459. C
  460. 48300 CAROFF=.NOT.CAROFF                        ! triangle, flip carousel.
  461.       IF(OROOM(IRBOX).NE.CAROU) GO TO 48400     ! iron box in carousel?
  462.       CALL RSPEAK(269)                          ! yes, thump.
  463.       OFLAG1(IRBOX)=OFLAG1(IRBOX).XOR.VISIBT    ! complement visibility.
  464.       IF(CAROFF) RFLAG(CAROU)=RFLAG(CAROU).AND. .NOT.RSEEN
  465.       RETURN
  466. C
  467. 48400 CALL RSPEAK(232)                          ! click.
  468.       RETURN
  469. C
  470. C O119--        Flask function
  471. C
  472. 49000 IF(PRSA.EQ.OPENW) GO TO 49100             ! open?
  473.       IF((PRSA.NE.MUNGW).AND.(PRSA.NE.THROWW)) GO TO 10
  474.       CALL NEWSTA(FLASK,270,0,0,0)              ! kill flask.
  475. 49100 RFLAG(HERE)=RFLAG(HERE).OR.RMUNG          ! mung room.
  476.       RDESC1(HERE)=271
  477.       CALL JIGSUP(272)                          ! poisoned.
  478.       RETURN
  479. C
  480. C O120--        Bucket function
  481. C
  482. 50000 IF(ARG.EQ.1) GO TO 10                     ! read in?
  483.       IF(ARG.EQ.2) GO TO 50400                  ! read out?
  484.       IF(PRSA.NE.BURNW) GO TO 50100             ! burn?
  485.       CALL RSPEAK(928)                          ! can't.
  486.       RETURN
  487. C
  488. 50100 IF(PRSA.NE.KICKW) GO TO 10                ! kick?
  489.       CALL JIGSUP(1067)                         ! dead.
  490.       RETURN
  491. C
  492. 50400 IF((OCAN(WATER).NE.BUCKE).OR.BUCKTF) GO TO 50500
  493.       BUCKTF=.TRUE.                             ! bucket at top.
  494.       CFLAG(CEVBUC)=.TRUE.
  495.       CTICK(CEVBUC)=100                         ! start countdown.
  496.       CALL NEWSTA(BUCKE,290,TWELL,0,0)          ! reposition bucket.
  497.       GO TO 50900                               ! finish up.
  498. C
  499. 50500 IF((OCAN(WATER).EQ.BUCKE).OR..NOT.BUCKTF) GO TO 10
  500.       BUCKTF=.FALSE.
  501.       CALL NEWSTA(BUCKE,291,BWELL,0,0)          ! bucket at bottom.
  502. 50900 IF(AV.NE.BUCKE) RETURN                    ! not in bucket?
  503.       F=MOVETO(OROOM(BUCKE),WINNER)             ! move adventurer.
  504.       F=RMDESC(0)                               ! describe room.
  505.       RETURN
  506.  
  507. C OAPPLI, PAGE 9
  508. C
  509. C O121--        Eatme cake
  510. C
  511. 51000 IF((PRSA.NE.EATW).OR.(PRSO.NE.ECAKE).OR.
  512.      1(HERE.NE.ALICE)) GO TO 10                 ! eat cake in aliceroom?
  513.       CALL NEWSTA(ECAKE,273,0,0,0)              ! vanish cake.
  514.       OFLAG1(ROBOT)=OFLAG1(ROBOT).AND. .NOT.VISIBT ! vanish robot.
  515.       DO 51100 I=1,OLNT                         ! make objects big.
  516.         IF((OROOM(I).NE.ALICE).OR.(OSIZE(I).EQ.10000))
  517.      1GO TO 51100
  518.         OSIZE(I)=OSIZE(I)*64
  519.         OROOM(I)=ALISM
  520. 51100 CONTINUE
  521.       OAPPLI=MOVETO(ALISM,WINNER)               ! move to alice small.
  522.       RETURN
  523. C
  524. C O122--        Icings
  525. C
  526. 52000 IF(PRSA.NE.READW) GO TO 52200             ! read?
  527.       I=274                                     ! cant read.
  528.       IF(PRSI.NE.0) I=275                       ! through something?
  529.       IF(PRSI.EQ.BOTTL) I=276                   ! through bottle?
  530.       IF(PRSI.EQ.FLASK) I=277+(PRSO-ORICE)      ! through flask?
  531.       CALL RSPEAK(I)                            ! read flask.
  532.       RETURN
  533. C
  534. 52200 IF((PRSA.NE.THROWW).OR.(PRSO.NE.RDICE).OR.(PRSI.NE.POOL))
  535.      1GO TO 52300                               ! throw rdice at pool?
  536.       CALL NEWSTA(POOL,280,0,0,0)               ! vanish pool.
  537.       OFLAG1(SAFFR)=OFLAG1(SAFFR).OR.VISIBT     ! materialize spices.
  538.       RETURN
  539. C
  540. 52300 IF((HERE.NE.ALICE).AND.(HERE.NE.ALISM).AND.(HERE.NE.ALITR))
  541.      1GO TO 10                                  ! in wonderland?
  542.       IF(((PRSA.NE.EATW).AND.(PRSA.NE.THROWW)).OR.
  543.      1(PRSO.NE.ORICE)) GO TO 52400              ! throw orange ice?
  544.       CALL NEWSTA(ORICE,0,0,0,0)                ! vanish orange ice.
  545.       RFLAG(HERE)=RFLAG(HERE).OR.RMUNG          ! vanish room.
  546.       RDESC1(HERE)=281
  547.       CALL JIGSUP(282)                          ! vanish adventurer.
  548.       RETURN
  549. C
  550. 52400 IF((PRSA.NE.EATW).OR.(PRSO.NE.BLICE))
  551.      1GO TO 10                                  ! eat blue ice?
  552.       CALL NEWSTA(BLICE,283,0,0,0)              ! vanish blue ice.
  553.       IF(HERE.NE.ALISM) GO TO 52500             ! in reduced room?
  554.       OFLAG1(ROBOT)=OFLAG1(ROBOT).OR.VISIBT     ! materialize robot.
  555.       DO 52450 I=1,OLNT                         ! enlarge world.
  556.         IF((OROOM(I).NE.HERE).OR.(OSIZE(I).EQ.10000))
  557.      1GO TO 52450
  558.         OROOM(I)=ALICE
  559.         OSIZE(I)=OSIZE(I)/64
  560. 52450 CONTINUE
  561.       OAPPLI=MOVETO(ALICE,WINNER)               ! return
  562.       RETURN
  563. C
  564. 52500 CALL JIGSUP(284)                          ! enlarged in wrong room.
  565.       RETURN
  566. C
  567. C O123--        Brick
  568. C
  569. 54000 IF(PRSA.NE.BURNW) GO TO 10                ! burn?
  570.       CALL NEWSTA(BRICK,0,0,0,0)                ! vanish brick.
  571.       CALL JIGSUP(150)                          ! boom!
  572.       RETURN
  573. C
  574. C O124--        Myself
  575. C
  576. 55000 IF((PRSA.NE.GIVEW).OR.
  577.      1((OFLAG2(PRSO).AND.NOCHBT).NE.0)) GO TO 55100 ! give?
  578.       IF(PRSO.NE.WATER) GO TO 55050             ! water?
  579.       CALL NEWSTA(WATER,615,0,0,0)              ! slips through fingers.
  580.       RETURN
  581. C
  582. 55050 CALL NEWSTA(PRSO,2,0,0,PLAYER)            ! done.
  583.       RETURN
  584. C
  585. 55100 IF(PRSA.NE.TAKEW) GO TO 55200             ! take?
  586.       CALL RSPEAK(286)                          ! joke.
  587.       RETURN
  588. C
  589. 55200 IF((PRSA.NE.KILLW).AND.(PRSA.NE.MUNGW)) GO TO 10
  590.       WINNER=PLAYER                             ! can't kill someone else.
  591.       CALL JIGSUP(287)                          ! kill, no joke.
  592.       RETURN
  593.  
  594. C OAPPLI, PAGE 10
  595. C
  596. C O125--        Panels inside mirror
  597. C
  598. 56000 IF(PRSA.NE.PUSHW) GO TO 10                ! push?
  599.       IF(POLEUF.NE.0) GO TO 56100               ! short pole up?
  600.       I=731                                     ! no, wont budge.
  601.       IF(MOD(MDIR,180).EQ.0) I=732              ! diff msg if n-s.
  602.       CALL RSPEAK(I)                            ! tell wont move.
  603.       RETURN
  604. C
  605. 56100 IF(MLOC.NE.MRG) GO TO 56200               ! in gdn room?
  606.       CALL RSPEAK(733)                          ! you lose.
  607.       CALL JIGSUP(685)
  608.       RETURN
  609. C
  610. 56200 I=831                                     ! rotate l or r.
  611.       IF((PRSO.EQ.RDWAL).OR.(PRSO.EQ.YLWAL)) I=830
  612.       CALL RSPEAK(I)                            ! tell direction.
  613.       MDIR=MOD(MDIR+45+(270*(I-830)),360)       ! calculate new dir.
  614.       CALL RSPSUB(734,695+(MDIR/45))            ! tell new dir.
  615.       IF(WDOPNF) CALL RSPEAK(730)               ! if panel open, close.
  616.       WDOPNF=.FALSE.
  617.       RETURN                                    ! done.
  618. C
  619. C O126--        Ends inside mirror
  620. C
  621. 57000 IF(PRSA.NE.PUSHW) GO TO 10                ! push?
  622.       IF(MOD(MDIR,180).EQ.0) GO TO 57100        ! mirror n-s?
  623.       CALL RSPEAK(735)                          ! no, wont budge.
  624.       RETURN
  625. C
  626. 57100 IF(PRSO.NE.PINDR) GO TO 57300             ! push pine wall?
  627.       IF(((MLOC.EQ.MRC).AND.(MDIR.EQ.180)).OR.
  628.      1 ((MLOC.EQ.MRD).AND.(MDIR.EQ.0)).OR.
  629.      2  (MLOC.EQ.MRG)) GO TO 57200              ! in view of gdn?
  630.       CALL RSPEAK(736)                          ! no, opens.
  631.       WDOPNF=.TRUE.                             ! indicate open.
  632.       CFLAG(CEVPIN)=.TRUE.                      ! time opening.
  633.       CTICK(CEVPIN)=5
  634.       RETURN
  635. C
  636. 57200 CALL RSPEAK(737)                          ! gdn sees you, die.
  637.       CALL JIGSUP(685)
  638.       RETURN
  639. C
  640. 57300 NLOC=MLOC-1                               ! new loc if south.
  641.       IF(MDIR.EQ.0) NLOC=MLOC+1                 ! new loc if north.
  642.       IF((NLOC.GE.MRA).AND.(NLOC.LE.MRD)) GO TO 57400
  643.       CALL RSPEAK(738)                          ! have reached end.
  644.       RETURN
  645. C
  646. 57400 I=699                                     ! assume south.
  647.       IF(MDIR.EQ.0) I=695                       ! north.
  648.       J=739                                     ! assume smooth.
  649.       IF(POLEUF.NE.0) J=740                     ! pole up, wobbles.
  650.       CALL RSPSUB(J,I)                          ! describe.
  651.       MLOC=NLOC
  652.       IF(MLOC.NE.MRG) RETURN                    ! now in gdn room?
  653. C
  654.       IF(POLEUF.NE.0) GO TO 57500               ! pole up, gdn sees.
  655.       IF(MROPNF.OR.WDOPNF) GO TO 57600          ! door open, gdn sees.
  656.       IF(MR1F.AND.MR2F) RETURN                  ! mirrors intact, ok.
  657.       CALL RSPEAK(742)                          ! mirrors broken, die.
  658.       CALL JIGSUP(743)
  659.       RETURN
  660. C
  661. 57500 CALL RSPEAK(741)                          ! pole up, die.
  662.       CALL JIGSUP(743)
  663.       RETURN
  664. C
  665. 57600 CALL RSPEAK(744)                          ! door open, die.
  666.       CALL JIGSUP(743)
  667.       RETURN
  668.  
  669. C OAPPLI, PAGE 11
  670. C
  671. C O127--        Global guardians
  672. C
  673. 58000 IF((PRSA.NE.ATTACW).AND.(PRSA.NE.KILLW).AND.
  674.      1 (PRSA.NE.MUNGW)) GO TO 58100             ! aggressive?
  675.       CALL JIGSUP(745)                          ! lose.
  676.       RETURN
  677. C
  678. 58100 IF(PRSA.NE.HELLOW) GO TO 10               ! hello?
  679.       CALL RSPEAK(746)                          ! no reply.
  680.       RETURN
  681. C
  682. C O128--        Global master
  683. C
  684. 59000 IF(((PRSA.NE.ATTACW).AND.(PRSA.NE.KILLW).AND.(PRSA.NE.MUNGW))
  685.      1.OR.(PRSO.NE.MASTER).OR.(PRSI.EQ.MASTER))
  686.      2GO TO 59100                               ! kill master?
  687.       WINNER=PLAYER                             ! rebounds on player.
  688.       CALL JIGSUP(747)                          ! bad idea.
  689.       RETURN
  690. C
  691. 59100 IF(PRSA.NE.TAKEW) GO TO 10                ! take?
  692.       CALL RSPEAK(748)                          ! joke.
  693.       RETURN
  694. C
  695. C O129--        Numeral five
  696. C
  697. 60000 IF(PRSA.NE.TAKEW) GO TO 10                ! take five?
  698.       CALL RSPEAK(419)                          ! time passes.
  699.       DO 60100 I=1,3                            ! wait a while.
  700.         IF(CLOCKD(X)) RETURN
  701. 60100 CONTINUE
  702.       RETURN
  703. C
  704. C O130--        Crypt function
  705. C
  706. 61000 IF(.NOT.ENDGMF) GO TO 45000               ! if not eg, die.
  707.       IF(PRSA.NE.OPENW) GO TO 61100             ! open?
  708.       I=793
  709.       IF(QOPEN(TOMB)) I=794
  710.       CALL RSPEAK(I)
  711.       OFLAG2(TOMB)=OFLAG2(TOMB).OR.OPENBT       ! now tomb with view.
  712.       RETURN
  713. C
  714. 61100 IF(PRSA.NE.CLOSEW) GO TO 45000            ! close?
  715.       I=795
  716.       IF(QOPEN(TOMB)) I=796
  717.       CALL RSPEAK(I)
  718.       OFLAG2(TOMB)=OFLAG2(TOMB).AND..NOT.OPENBT
  719.       IF(HERE.NE.CRYPT) RETURN
  720.       CFLAG(CEVSTE)=.TRUE.
  721.       CTICK(CEVSTE)=3                           ! if in crypt, start eg.
  722.       RETURN
  723.  
  724. C OAPPLI, PAGE 12
  725. C
  726. C O131--        Global ladder
  727. C
  728. 62000 IF((CPVEC(CPHERE+1).EQ.-2).OR.(CPVEC(CPHERE-1).EQ.-3))
  729.      1GO TO 62100                               ! ladder here?
  730.       CALL RSPEAK(865)                          ! no, lose.
  731.       RETURN
  732. C
  733. 62100 IF((PRSA.EQ.CLMBW).OR.(PRSA.EQ.CLMBUW)) GO TO 62200
  734.       CALL RSPEAK(866)                          ! climb it?
  735.       RETURN
  736. C
  737. 62200 IF((CPHERE.EQ.10).AND.(CPVEC(CPHERE+1).EQ.-2))
  738.      1GO TO 62300                               ! at exit?
  739.       CALL RSPEAK(867)                          ! no, hit your head.
  740.       RETURN
  741. C
  742. 62300 F=MOVETO(CPANT,WINNER)                    ! to anteroom.
  743.       F=RMDESC(3)                               ! describe.
  744.       RETURN
  745. C
  746.       END
  747.  
  748. C SOBJS-        Simple objects processor
  749. C
  750. C Declarations
  751. C
  752.       LOGICAL FUNCTION SOBJS(RI,ARG)
  753.       IMPLICIT INTEGER (A-Z)
  754.       INCLUDE 'dparam.for'
  755.       LOGICAL MOVETO,OPNCLS,LIT,WASLIT
  756.       LOGICAL F,QOPEN
  757. C
  758. C Functions and data
  759. C
  760.       QOPEN(R)=(OFLAG2(R).AND.OPENBT).NE.0
  761. C
  762.       ODO2=0
  763.       ODI2=0
  764.       IF((PRSO.NE.0).AND.(PRSO.LE.OMAX)) ODO2=ODESC2(PRSO)
  765.       IF(PRSI.NE.0) ODI2=ODESC2(PRSI)
  766.       AV=AVEHIC(WINNER)
  767.       SOBJS=.TRUE.
  768.       WASLIT=LIT(HERE)
  769. C
  770.       GO TO (1000,3000,4000,6000,7000,8000,9000,
  771.      113000,14000,16000,17000,
  772.      221000,23000,24000,27000,28000,29000,30000,
  773.      331000,33000,34000,36000,37000,38000,
  774.      441000,42000,43000,44000,46000,
  775.      553000,56000)
  776.      6RI
  777.       CALL BUG(6,RI)
  778. C
  779. C Return here to declare false result.
  780. C
  781. 10    SOBJS=.FALSE.
  782.       RETURN
  783. C
  784. C Return here to test for light source change.
  785. C
  786. 50    IF(WASLIT.AND..NOT.LIT(HERE)) CALL RSPEAK(406)
  787.       RETURN
  788.  
  789. C SOBJS, PAGE 3
  790. C
  791. C O1--  Gunk
  792. C
  793. 1000  IF(OCAN(GUNK).EQ.0) GO TO 10              ! not inside? f
  794.       CALL NEWSTA(GUNK,122,0,0,0)               ! falls apart.
  795.       RETURN
  796. C
  797. C O2--  Trophy case
  798. C
  799. 3000  IF(PRSA.NE.TAKEW) GO TO 10                ! take?
  800.       CALL RSPEAK(128)                          ! cant.
  801.       RETURN
  802. C
  803. C O3--  Bottle
  804. C
  805. 4000  IF((PRSA.NE.THROWW).OR.(PRSO.NE.BOTTL)) GO TO 4100 ! throw?
  806.       CALL NEWSTA(BOTTL,129,0,0,0)              ! breaks.
  807.       RETURN
  808. C
  809. 4100  IF(PRSA.NE.MUNGW) GO TO 10                ! mung?
  810.       CALL NEWSTA(BOTTL,131,0,0,0)              ! breaks.
  811.       RETURN
  812.  
  813. C SOBJS, PAGE 4
  814. C
  815. C O4--  Rope
  816. C
  817. 6000  IF((HERE.EQ.DOME).OR.(HERE.EQ.SLIDE).OR.(PRSI.EQ.0).OR.
  818.      1 (PRSI.EQ.TIMBE).OR.(PRSI.EQ.COFFI)) GO TO 6100
  819.       IF(PRSA.EQ.TIEW) CALL RSPEAK(135)         ! tie, cant do it.
  820. 6050  DOMEF=.FALSE.                             ! not tied in dome.
  821.       TTIE=0                                    ! not tied to timber.
  822.       OFLAG1(TIMBE)=OFLAG1(TIMBE).AND..NOT.NDSCBT
  823.       OFLAG1(COFFI)=OFLAG1(COFFI).AND..NOT.NDSCBT
  824.       ODESC1(TIMBE)=1032                        ! restore timber, coffin
  825.       ODESC1(COFFI)=1033
  826.       OFLAG1(ROPE)=OFLAG1(ROPE).AND..NOT.NDSCBT
  827.       OFLAG2(ROPE)=OFLAG2(ROPE).AND..NOT.CLMBBT
  828.       RETURN                                    ! rope not climbable
  829. C
  830. 6100  IF((PRSA.NE.CLMBDW).OR.(HERE.NE.CPANT)) GO TO 6200
  831.       IF(TTIE.EQ.0) GO TO 6150                  ! climb down, tied?
  832.       IF(OROOM(TTIE).NE.HERE) GO TO 6150        ! tied here?
  833.       CALL RSPSUB(1028,ODESC2(TTIE))            ! yes, tumbles after you.
  834.       CALL NEWSTA(ROPE,0,CPUZZ,0,0)             ! now in puzzle room.
  835.       CALL NEWSTA(TTIE,0,CPUZZ,0,0)
  836.       GO TO 10                                  ! not handled here.
  837. C
  838. 6150  CALL RSPEAK(1029)                         ! not tied.
  839.       GO TO 10                                  ! not handled here.
  840. C
  841. 6200  IF(PRSA.NE.TIEW) GO TO 6400               ! tie rope?
  842.       IF(PRSI.NE.RAILI) GO TO 6300              ! to railing?
  843.       IF(DOMEF.OR.(TTIE.NE.0)) GO TO 6250       ! already tied?
  844.       DOMEF=.TRUE.                              ! no, now tied.
  845.       CALL NEWSTA(ROPE,137,DOME,0,0)            ! put in dome room.
  846. 6225  OFLAG1(ROPE)=OFLAG1(ROPE).OR.NDSCBT
  847.       OFLAG2(ROPE)=OFLAG2(ROPE).OR.CLMBBT       ! now climbable
  848.       RETURN
  849. C
  850. 6250  CALL RSPEAK(136)                          ! already tied.
  851.       RETURN
  852. C
  853. 6300  IF((PRSI.NE.TIMBE).AND.(PRSI.NE.COFFI)) GO TO 10
  854.       IF(DOMEF.OR.(TTIE.NE.0)) GO TO 6250       ! already done?
  855.       IF(OROOM(PRSI).NE.0) GO TO 6350           ! target on ground?
  856.       CALL RSPEAK(1025)                         ! too clumsy.
  857.       RETURN
  858. C
  859. 6350  CALL RSPSUB(961,ODI2)                     ! now tied to object.
  860.       TTIE=PRSI
  861.       IF(PRSI.EQ.TIMBE) ODESC1(TIMBE)=1030      ! change description
  862.       IF(PRSI.EQ.COFFI) ODESC1(COFFI)=1031      ! of target.
  863.       IF(HERE.EQ.CPANT) CALL RSPEAK(1056)       ! room-specific words.
  864.       IF(HERE.EQ.SLIDE) CALL RSPEAK(339)
  865.       IF(HERE.EQ.SLIDE) OFLAG1(PRSI)=OFLAG1(PRSI).OR.NDSCBT
  866.       CALL NEWSTA(ROPE,0,HERE,0,0)              ! put rope in room.
  867.       GO TO 6225                                ! rope now climbable.
  868. C
  869. 6400  IF(PRSA.NE.UNTIEW) GO TO 6600             ! untie rope?
  870.       IF(.NOT.DOMEF.AND.(TTIE.EQ.0)) GO TO 6500 ! tied to obj or railing?
  871.       CALL RSPEAK(139)                          ! report and then
  872.       GO TO 6050                                ! clean up all status.
  873. C
  874. 6500  CALL RSPEAK(134)                          ! not tied to anything.
  875.       RETURN
  876. C
  877. 6600  IF(DOMEF.OR.(PRSA.NE.DROPW).OR.
  878.      1(HERE.NE.DOME)) GO TO 6700                ! drop & untied from dome?
  879.       CALL NEWSTA(ROPE,140,MTORC,0,0)           ! yes, drop.
  880.       RETURN
  881. C
  882. 6700  IF((PRSA.NE.TAKEW).OR..NOT.DOMEF) GO TO 6800
  883.       CALL RSPEAK(141)                          ! take & tied.
  884.       RETURN
  885. C
  886. 6800  IF((PRSA.NE.TAKEW).OR.(TTIE.EQ.0)) GO TO 10
  887.       CALL RSPSUB(926,ODESC2(TTIE))             ! take & tied.
  888.       RETURN
  889. C
  890. C O5--  Sword
  891. C
  892. 7000  IF((PRSA.EQ.TAKEW).AND.(WINNER.EQ.PLAYER))
  893.      1SWDACT=.TRUE.                             ! turn on demon.
  894.       GO TO 10
  895. C
  896. C O6--  Lantern
  897. C
  898. 8000  IF((PRSA.NE.THROWW).OR.(PRSO.NE.LAMP)) GO TO 8100 ! throw?
  899.       CALL NEWSTA(LAMP,0,0,0,0)                 ! kill lamp,
  900.       CALL NEWSTA(BLAMP,142,HERE,0,0)           ! replace with broken.
  901.       IF(HERE.EQ.MTREE) CALL NEWSTA(BLAMP,0,FORE3,0,0)
  902.       IF(LASTIT.EQ.LAMP) LASTIT=BLAMP           ! fix last it reference.
  903.       CFLAG(CEVLNT)=.FALSE.                     ! turn off timer.
  904.       GO TO 50                                  ! go see if now dark.
  905. C
  906. 8100  IF(PRSA.EQ.TRNONW) CFLAG(CEVLNT)=.TRUE.
  907.       IF(PRSA.EQ.TRNOFW) CFLAG(CEVLNT)=.FALSE.
  908.       GO TO 10
  909. C
  910. C O7--  Rug
  911. C
  912. 9000  IF(PRSA.NE.RAISEW) GO TO 9100             ! raise?
  913.       CALL RSPEAK(143)                          ! cant
  914.       RETURN
  915. C
  916. 9100  IF(PRSA.NE.TAKEW) GO TO 9200              ! take?
  917.       CALL RSPEAK(144)                          ! cant
  918.       RETURN
  919. C
  920. 9200  IF(PRSA.NE.MOVEW) GO TO 9300              ! move?
  921.       CALL RSPEAK(145+ORRUG)
  922.       ORRUG=1
  923.       OFLAG1(DOOR)=OFLAG1(DOOR).OR.VISIBT       ! reveal door.
  924.       RETURN
  925. C
  926. 9300  IF((PRSA.NE.LOOKUW).OR.(ORRUG.NE.0).OR.
  927.      1QOPEN(DOOR)) GO TO 10                     ! look under rug?
  928.       CALL RSPEAK(345)
  929.       RETURN
  930.  
  931. C SOBJS, PAGE 5
  932. C
  933. C O8--  Skeleton
  934. C
  935. 13000 I=ROBRM(HERE,100,LLD2,0,0)+ROBADV(WINNER,LLD2,0,0)
  936.       CALL RSPEAK(162)                          ! curses.
  937.       RETURN
  938. C
  939. C O9--  Mirror
  940. C
  941. 14000 IF(MIRRMF.OR.(PRSA.NE.RUBW)) GO TO 14500
  942.       MROOM=HERE.XOR.1                          ! calculate new rm.
  943.       DO 14100 I=1,OLNT                         ! interchange objs.
  944.         IF(OROOM(I).EQ.HERE) OROOM(I)=-1
  945.         IF(OROOM(I).EQ.MROOM) OROOM(I)=HERE
  946.         IF(OROOM(I).EQ.-1) OROOM(I)=MROOM
  947. 14100 CONTINUE
  948.       F=MOVETO(MROOM,WINNER)
  949.       CALL RSPEAK(163)                          ! shake world.
  950.       RETURN
  951. C
  952. 14500 IF((PRSA.NE.LOOKW).AND.(PRSA.NE.LOOKIW).AND.
  953.      1(PRSA.NE.EXAMIW)) GO TO 14600
  954.       I=164                                     ! mirror ok.
  955.       IF(MIRRMF) I=165                          ! mirror dead.
  956.       CALL RSPEAK(I)
  957.       RETURN
  958. C
  959. 14600 IF(PRSA.NE.TAKEW) GO TO 14700             ! take?
  960.       CALL RSPEAK(166)                          ! joke.
  961.       RETURN
  962. C
  963. 14700 IF((PRSA.NE.MUNGW).AND.(PRSA.NE.THROWW)) GO TO 10
  964.       I=167                                     ! mirror breaks.
  965.       IF(MIRRMF) I=168                          ! mirror already broken.
  966.       MIRRMF=.TRUE.
  967.       BADLKF=.TRUE.
  968.       CALL RSPEAK(I)
  969.       RETURN
  970.  
  971. C SOBJS, PAGE 6
  972. C
  973. C O10-- Dumbwaiter
  974. C
  975. 16000 IF(PRSA.NE.RAISEW) GO TO 16100            ! raise?
  976.       IF(CAGETF) GO TO 16400                    ! already at top?
  977.       CALL NEWSTA(TBASK,175,TSHAF,0,0)          ! no, raise basket.
  978.       CALL NEWSTA(FBASK,0,BSHAF,0,0)
  979.       IF(HERE.EQ.TSHAF) LASTIT=TBASK            ! fix last it reference.
  980.       IF(HERE.EQ.BSHAF) LASTIT=FBASK
  981.       CAGETF=.TRUE.                             ! at top.
  982.       RETURN
  983. C
  984. 16100 IF(PRSA.NE.LOWERW) GO TO 16200            ! lower?
  985.       IF(.NOT.CAGETF) GO TO 16400               ! already at bottom?
  986.       CALL NEWSTA(TBASK,176,BSHAF,0,0)          ! no, lower basket.
  987.       CALL NEWSTA(FBASK,0,TSHAF,0,0)
  988.       IF(HERE.EQ.TSHAF) LASTIT=FBASK            ! fix last it reference.
  989.       IF(HERE.EQ.BSHAF) LASTIT=TBASK
  990.       CAGETF=.FALSE.
  991.       GO TO 50                                  ! go see if now dark.
  992. C
  993. 16200 IF((PRSO.NE.FBASK).AND.(PRSI.NE.FBASK)) GO TO 16300
  994.       CALL RSPEAK(130)                          ! wrong basket.
  995.       RETURN
  996. C
  997. 16300 IF(PRSA.NE.TAKEW) GO TO 10                ! take?
  998.       CALL RSPEAK(177)                          ! joke.
  999.       RETURN
  1000. C
  1001. 16400 CALL RSPEAK(125+RND(3))                   ! dummy.
  1002.       RETURN
  1003. C
  1004. C O11-- Ghost
  1005. C
  1006. 17000 IF(PRSO.NE.GHOST) GO TO 17100             ! direct object?
  1007.       CALL RSPEAK(178)                          ! joke.
  1008.       RETURN
  1009. C
  1010. 17100 CALL RSPEAK(179)                          ! joke.
  1011.       GO TO 10                                  ! don't handle.
  1012.  
  1013. C SOBJS, PAGE 7
  1014. C
  1015. C O12-- Tube
  1016. C
  1017. 21000 IF((PRSA.NE.PUTW).OR.(PRSI.NE.TUBE)) GO TO 21100
  1018.       CALL RSPEAK(186)                          ! cant put back in.
  1019.       RETURN
  1020. C
  1021. 21100 IF(PRSA.NE.SQUEEW) GO TO 10               ! squeeze?
  1022.       IF(QOPEN(PRSO)) GO TO 21200               ! tube open?
  1023.       CALL RSPEAK(909)                          ! no, can't do it.
  1024.       RETURN
  1025. C
  1026. 21200 IF(OCAN(PUTTY).EQ.PRSO) GO TO 21300       ! putty inside?
  1027.       CALL RSPEAK(910)                          ! no, doesn't work.
  1028.       RETURN
  1029. C
  1030. 21300 CALL NEWSTA(PUTTY,911,0,0,WINNER)         ! putty now in hand.
  1031.       RETURN
  1032. C
  1033. C O13-- Chalice
  1034. C
  1035. 23000 IF((PRSA.NE.TAKEW).OR.(OCAN(PRSO).NE.0).OR.
  1036.      1(OROOM(PRSO).NE.TREAS).OR.(OROOM(THIEF).NE.TREAS).OR.
  1037.      2((OFLAG2(THIEF).AND.FITEBT).EQ.0).OR.
  1038.      3.NOT. THFACT) GO TO 10
  1039.       CALL RSPEAK(204)                          ! cant take.
  1040.       RETURN
  1041. C
  1042. C O14-- Painting
  1043. C
  1044. 24000 IF(PRSA.NE.MUNGW) GO TO 10                ! mung?
  1045.       CALL RSPEAK(205)                          ! destroy painting.
  1046.       OFVAL(PRSO)=0
  1047.       OTVAL(PRSO)=0
  1048.       ODESC1(PRSO)=207
  1049.       ODESC2(PRSO)=206
  1050.       RETURN
  1051.  
  1052. C SOBJS, PAGE 8
  1053. C
  1054. C O15-- Bolt
  1055. C
  1056. 27000 IF(PRSA.NE.TURNW) GO TO 27600             ! turn bolt?
  1057.       IF(PRSI.NE.WRENC) GO TO 27500             ! with wrench?
  1058.       IF(GATEF) GO TO 27100                     ! proper button pushed?
  1059.       CALL RSPEAK(210)                          ! no, lose.
  1060.       RETURN
  1061. C
  1062. 27100 IF(LWTIDF) GO TO 27200                    ! low tide now?
  1063.       LWTIDF=.TRUE.                             ! no, empty dam.
  1064.       CALL RSPEAK(211)
  1065.       OFLAG2(COFFI)=OFLAG2(COFFI).AND. .NOT.SCRDBT
  1066.       OFLAG1(TRUNK)=OFLAG1(TRUNK).OR.VISIBT     ! materialize trunk.
  1067.       RFLAG(RESER)=(RFLAG(RESER).OR.RLAND)
  1068.      1.AND..NOT.(RWATER+RSEEN)                  ! keep thief away.
  1069.       RETURN
  1070. C
  1071. 27200 LWTIDF=.FALSE.                            ! yes, fill dam.
  1072.       CALL RSPEAK(212)
  1073.       IF(OROOM(TRUNK).EQ.RESER) OFLAG1(TRUNK)=OFLAG1(TRUNK)
  1074.      1.AND. .NOT.VISIBT
  1075.       RFLAG(RESER)=(RFLAG(RESER).OR.RWATER) .AND..NOT.RLAND
  1076.       RETURN
  1077. C
  1078. 27500 CALL RSPSUB(299,ODI2)                     ! not with that.
  1079.       RETURN
  1080. C
  1081. 27600 IF(PRSA.NE.OILW) GO TO 10                 ! oil?
  1082.       CALL RSPEAK(906)                          ! trouble.
  1083.       RETURN
  1084. C
  1085. C O16-- Grating
  1086. C
  1087. 28000 IF((PRSA.NE.OPENW).AND.(PRSA.NE.CLOSEW)) GO TO 10
  1088.       IF(GRUNLF) GO TO 28100                    ! unlocked?
  1089.       CALL RSPEAK(214)                          ! no, locked.
  1090.       RETURN
  1091. C
  1092. 28100 I=215                                     ! unlocked, view frm below.
  1093.       IF(HERE.EQ.CLEAR) I=216                   ! view from clearing
  1094.       SOBJS=OPNCLS(GRATE,I,885)                 ! open/close.
  1095.       RFLAG(MGRAT)=RFLAG(MGRAT).AND. .NOT.RLIGHT ! set light/dark.
  1096.       IF(.NOT.QOPEN(GRATE)) GO TO 50            ! if not open, done.
  1097.       RFLAG(MGRAT)=RFLAG(MGRAT).OR.RLIGHT       ! now lit.
  1098.       RVCLR=1                                   ! leaves shoved aside.
  1099.       CALL NEWSTA(GRATE,0,CLEAR,0,0)            ! grating in clearing.
  1100.       RETURN
  1101. C
  1102. C O17-- Trap door
  1103. C
  1104. 29000 IF(HERE.NE.LROOM) GO TO 29100             ! from living room?
  1105.       SOBJS=OPNCLS(DOOR,218,219)                ! open/close.
  1106.       RETURN
  1107. C
  1108. 29100 IF(HERE.NE.CELLA) GO TO 10                ! from cellar?
  1109.       IF((PRSA.NE.OPENW).OR.QOPEN(DOOR)) GO TO 29200
  1110.       CALL RSPEAK(220)                          ! cant open closed door.
  1111.       RETURN
  1112. C
  1113. 29200 SOBJS=OPNCLS(DOOR,0,22)                   ! normal open/close.
  1114.       RETURN
  1115. C
  1116. C O18-- Durable door
  1117. C
  1118. 30000 I=0                                       ! assume no appl.
  1119.       IF(PRSA.EQ.OPENW) I=221                   ! open?
  1120.       IF(PRSA.EQ.BURNW) I=222                   ! burn?
  1121.       IF(PRSA.EQ.MUNGW) I=223+RND(3)            ! mung?
  1122.       IF(I.EQ.0) GO TO 10
  1123.       CALL RSPEAK(I)
  1124.       RETURN
  1125. C
  1126. C O19-- Master switch
  1127. C
  1128. 31000 IF(PRSA.NE.TURNW) GO TO 10                ! turn?
  1129.       IF(PRSI.NE.SCREW) GO TO 31500             ! with screwdriver?
  1130.       IF(QOPEN(MACHI)) GO TO 31600              ! lid up?
  1131.       CALL RSPEAK(226)                          ! no, activate.
  1132.       IF(OCAN(COAL).NE.MACHI) GO TO 31400       ! coal inside?
  1133.       CALL NEWSTA(COAL,0,0,0,0)                 ! kill coal,
  1134.       CALL NEWSTA(DIAMO,0,0,MACHI,0)            ! replace with diamond.
  1135.       RETURN
  1136. C
  1137. 31400 DO 31450 I=1,OLNT                         ! kill noncoal objects.
  1138.         IF(OCAN(I).NE.MACHI) GO TO 31450        ! inside machine?
  1139.         CALL NEWSTA(I,0,0,0,0)                  ! kill object and contents.
  1140.         CALL NEWSTA(GUNK,0,0,MACHI,0)           ! reduce to gunk.
  1141. 31450 CONTINUE
  1142.       RETURN
  1143. C
  1144. 31500 CALL RSPSUB(300,ODI2)                     ! cant turn with that.
  1145.       RETURN
  1146. C
  1147. 31600 CALL RSPEAK(227)                          ! lid is up.
  1148.       RETURN
  1149.  
  1150. C SOBJS, PAGE 9
  1151. C
  1152. C O20-- Leak
  1153. C
  1154. 33000 IF((PRSO.NE.LEAK).OR.(PRSA.NE.PLUGW).OR.(RVMNT.LE.0))
  1155.      1GO TO 10                                  ! plug active leak?
  1156.       IF(PRSI.NE.PUTTY) GO TO 33100             ! with putty?
  1157.       RVMNT=-1                                  ! disable leak.
  1158.       CTICK(CEVMNT)=0
  1159.       CALL RSPEAK(577)
  1160.       RETURN
  1161. C
  1162. 33100 CALL RSPSUB(301,ODI2)                     ! cant with that.
  1163.       RETURN
  1164. C
  1165. C O21-- Drowning buttons
  1166. C
  1167. 34000 IF(PRSA.NE.PUSHW) GO TO 10                ! push?
  1168.       GO TO (34100,34200,34300,34400),(PRSO-RBUTT+1)
  1169.       GO TO 10                                  ! not a button.
  1170. C
  1171. 34100 RFLAG(HERE)=RFLAG(HERE).XOR.RLIGHT        ! red, zap lights.
  1172.       I=230
  1173.       IF((RFLAG(HERE).AND.RLIGHT).NE.0) I=231
  1174.       CALL RSPEAK(I)
  1175.       GO TO 50                                  ! go see if now dark.
  1176. C
  1177. 34200 GATEF=.TRUE.                              ! yellow, release gate.
  1178.       CALL RSPEAK(232)
  1179.       RETURN
  1180. C
  1181. 34300 GATEF=.FALSE.                             ! brown, interlock gate.
  1182.       CALL RSPEAK(232)
  1183.       RETURN
  1184. C
  1185. 34400 IF(RVMNT.NE.0) GO TO 34500                ! blue, leak already started?
  1186.       CALL RSPEAK(233)                          ! no, start leak.
  1187.       RVMNT=1
  1188.       CFLAG(CEVMNT)=.TRUE.
  1189.       CTICK(CEVMNT)=-1
  1190.       RFLAG(HERE)=RFLAG(HERE).OR.RFILL          ! water present.
  1191.       OFLAG1(LEAK)=OFLAG1(LEAK).OR.VISIBT       ! bring on the leak.
  1192.       RETURN
  1193. C
  1194. 34500 CALL RSPEAK(234)                          ! button jammed.
  1195.       RETURN
  1196. C
  1197. C O22-- Inflatable boat
  1198. C
  1199. 36000 IF(PRSA.NE.INFLAW) GO TO 10               ! inflate?
  1200.       IF(OROOM(IBOAT).NE.0) GO TO 36100         ! in room?
  1201.       CALL RSPEAK(235)                          ! no, joke.
  1202.       RETURN
  1203. C
  1204. 36100 IF(PRSI.NE.PUMP) GO TO 36200              ! with pump?
  1205.       CALL NEWSTA(IBOAT,0,0,0,0)                ! kill defl boat,
  1206.       CALL NEWSTA(RBOAT,236,HERE,0,0)           ! repl with inf.
  1207.       IF(LASTIT.EQ.IBOAT) LASTIT=RBOAT          ! fix last it reference.
  1208.       DEFLAF=.FALSE.
  1209.       RETURN
  1210. C
  1211. 36200 I=237                                     ! jokes.
  1212.       IF(PRSI.NE.LUNGS) I=303
  1213.       CALL RSPSUB(I,ODI2)
  1214.       RETURN
  1215. C
  1216. C O23-- Deflated boat
  1217. C
  1218. 37000 IF(PRSA.NE.INFLAW) GO TO 37100            ! inflate?
  1219.       CALL RSPEAK(238)                          ! joke.
  1220.       RETURN
  1221. C
  1222. 37100 IF(PRSA.NE.PLUGW) GO TO 10                ! plug?
  1223.       IF(PRSI.NE.PUTTY) GO TO 33100             ! with putty?
  1224.       CALL NEWSTA(IBOAT,239,OROOM(DBOAT),OCAN(DBOAT),OADV(DBOAT))
  1225.       CALL NEWSTA(DBOAT,0,0,0,0)                ! kill defl boat, repl.
  1226.       IF(LASTIT.EQ.DBOAT) LASTIT=IBOAT          ! fix last it reference.
  1227.       RETURN
  1228.  
  1229. C SOBJS, PAGE 10
  1230. C
  1231. C O24-- Rubber boat
  1232. C
  1233. 38000 IF(ARG.NE.0) GO TO 10                     ! dismiss readin, out.
  1234.       IF((PRSA.NE.BOARDW).OR.(OADV(STICK).NE.WINNER)) GO TO 38100
  1235.       CALL NEWSTA(RBOAT,0,0,0,0)                ! kill infl boat,
  1236.       CALL NEWSTA(DBOAT,240,HERE,0,0)           ! repl with dead.
  1237.       IF(LASTIT.EQ.RBOAT) LASTIT=DBOAT          ! fix last it reference.
  1238.       DEFLAF=.TRUE.
  1239.       GO TO 50                                  ! go see if now dark.
  1240. C
  1241. 38100 IF(PRSA.NE.INFLAW) GO TO 38200            ! inflate?
  1242.       CALL RSPEAK(367)                          ! yes, joke.
  1243.       RETURN
  1244. C
  1245. 38200 IF(PRSA.NE.DEFLAW) GO TO 10               ! deflate?
  1246.       IF(AV.EQ.RBOAT) GO TO 38300               ! in boat?
  1247.       IF(OROOM(RBOAT).EQ.0) GO TO 38400         ! on ground?
  1248.       CALL NEWSTA(RBOAT,0,0,0,0)                ! kill infl boat,
  1249.       CALL NEWSTA(IBOAT,241,HERE,0,0)           ! repl with defl.
  1250.       IF(LASTIT.EQ.RBOAT) LASTIT=IBOAT          ! fix last it reference.
  1251.       DEFLAF=.TRUE.
  1252.       GO TO 50                                  ! go see if now dark.
  1253. C
  1254. 38300 CALL RSPEAK(242)                          ! in boat.
  1255.       RETURN
  1256. C
  1257. 38400 CALL RSPEAK(243)                          ! not on ground.
  1258.       RETURN
  1259. C
  1260. C O25-- Braided rope (also balloon receptacle, cloth bag)
  1261. C
  1262. 41000 IF((PRSA.NE.TIEW).OR.(PRSO.NE.BROPE).OR.
  1263.      1((PRSI.NE.HOOK1).AND.(PRSI.NE.HOOK2)))
  1264.      2GO TO 41100                               ! tie to hook?
  1265.       BTIEF=PRSI                                ! record location.
  1266.       ODESC1(BTIEF)=1072                        ! change description.
  1267.       CFLAG(CEVBAL)=.FALSE.                     ! stall ascent.
  1268.       CALL RSPEAK(248)
  1269.       RETURN
  1270. C
  1271. 41100 IF((PRSA.NE.UNTIEW).OR.(PRSO.NE.BROPE)) GO TO 41300
  1272.       IF(BTIEF.NE.0) GO TO 41200                ! tied up?
  1273.       CALL RSPEAK(249)                          ! no, joke.
  1274.       RETURN
  1275. C
  1276. 41200 CALL RSPEAK(250)
  1277.       ODESC1(BTIEF)=1073                        ! restore description.
  1278.       BTIEF=0                                   ! untie.
  1279.       CFLAG(CEVBAL)=.TRUE.
  1280.       CTICK(CEVBAL)=3                           ! restart clock.
  1281.       RETURN
  1282. C
  1283. 41300 IF((PRSA.NE.FINDW).AND.(PRSA.NE.EXAMIW)) GO TO 41400
  1284.       CALL RSPSUB(1063,ODO2)                    ! describe.
  1285.       RETURN
  1286. C
  1287. 41400 IF(PRSA.NE.TAKEW) GO TO 10                ! take?
  1288.       CALL RSPSUB(1064,ODO2)                    ! can't.
  1289.       IF(PRSO.EQ.BROPE) CALL RSPEAK(1065)       ! rope can be tied.
  1290.       RETURN
  1291. C
  1292. C O26-- Safe
  1293. C
  1294. 42000 I=0                                       ! assume unprocessed.
  1295.       IF(PRSA.EQ.TAKEW) I=251                   ! take?
  1296.       IF((PRSA.EQ.OPENW).AND.SAFEF) I=253       ! open after blast?
  1297.       IF((PRSA.EQ.OPENW).AND..NOT.SAFEF) I=254  ! open before blast?
  1298.       IF((PRSA.EQ.CLOSEW).AND.SAFEF) I=253      ! close after?
  1299.       IF((PRSA.EQ.CLOSEW).AND..NOT.SAFEF) I=255
  1300.       IF(I.EQ.0) GO TO 10
  1301.       CALL RSPEAK(I)
  1302.       RETURN
  1303. C
  1304. C O27-- Fuse
  1305. C
  1306. 43000 IF(PRSA.NE.BURNW) GO TO 10                ! burn?
  1307.       CALL RSPEAK(256)
  1308.       CFLAG(CEVFUS)=.TRUE.
  1309.       CTICK(CEVFUS)=2                           ! start countdown.
  1310.       RETURN
  1311. C
  1312. C O28-- Gnome
  1313. C
  1314. 44000 IF((PRSA.NE.GIVEW).AND.(PRSA.NE.THROWW)) GO TO 44500
  1315.       IF(OTVAL(PRSO).EQ.0) GO TO 44100          ! treasure?
  1316.       CALL RSPSUB(257,ODO2)                     ! yes, get door.
  1317.       CALL NEWSTA(PRSO,0,0,0,0)
  1318.       CALL NEWSTA(GNOME,0,0,0,0)                ! vanish gnome.
  1319.       GNODRF=.TRUE.
  1320.       GO TO 50                                  ! go see if now dark.
  1321. C
  1322. 44100 IF((PRSO.NE.BRICK).OR.(OCAN(FUSE).NE.BRICK).OR.
  1323.      1(CTICK(CEVFUS).EQ.0)) GO TO 44200 ! a bomb?
  1324.       CALL NEWSTA(GNOME,927,0,0,0)              ! gnome leaves.
  1325.       CALL NEWSTA(BRICK,0,HERE,0,0)             ! brick on floor.
  1326.       CFLAG(CEVVLG)=.FALSE.                     ! turn off gnome clocks.
  1327.       CFLAG(CEVGNO)=.FALSE.
  1328.       RETURN
  1329. C
  1330. 44200 CALL RSPSUB(258,ODO2)                     ! no, lose object.
  1331.       CALL NEWSTA(PRSO,0,0,0,0)
  1332.       GO TO 50                                  ! go see if now dark.
  1333. C
  1334. 44500 CALL RSPEAK(259)                          ! nervous gnome.
  1335.       IF(GNOMEF) RETURN
  1336.       CFLAG(CEVGNO)=.TRUE.
  1337.       CTICK(CEVGNO)=5                           ! schedule byebye.
  1338.       GNOMEF=.TRUE.
  1339.       RETURN
  1340. C
  1341. C O29-- Coke bottles
  1342. C
  1343. 46000 IF((PRSA.NE.THROWW).AND.(PRSA.NE.MUNGW)) GO TO 10
  1344.       CALL NEWSTA(COKES,262,0,0,0)              ! mung bottles.
  1345.       IF(PRSI.NE.COKES) RETURN                  ! with cokes?
  1346.       CALL RSPSUB(1066,ODO2)                    ! kill direct object, too.
  1347.       CALL NEWSTA(PRSO,0,0,0,0)
  1348.       RETURN
  1349.  
  1350. C SOBJS, PAGE 11
  1351. C
  1352. C O30-- Robot
  1353. C
  1354. 53000 IF(PRSA.NE.GIVEW) GO TO 53200             ! give?
  1355.       IF(PRSO.NE.WATER) GO TO 53100             ! water?
  1356.       CALL NEWSTA(WATER,1081,0,0,0)             ! slips through fingers.
  1357.       RETURN
  1358. C
  1359. 53100 CALL NEWSTA(PRSO,0,0,0,AROBOT)            ! put on robot.
  1360.       CALL RSPSUB(302,ODO2)
  1361.       RETURN
  1362. C
  1363. 53200 IF(((PRSA.NE.MUNGW).AND.(PRSA.NE.THROWW)).OR.
  1364.      1 ((PRSO.NE.ROBOT).AND.(PRSI.NE.ROBOT))) GO TO 10
  1365.       CALL NEWSTA(ROBOT,285,0,0,0)              ! kill robot.
  1366.       GO TO 50                                  ! go see if now dark.
  1367. C
  1368. C O31-- Grue
  1369. C
  1370. 56000 IF(PRSA.NE.EXAMIW) GO TO 56100            ! examine?
  1371.       CALL RSPEAK(288)
  1372.       RETURN
  1373. C
  1374. 56100 IF(PRSA.NE.FINDW) GO TO 10                ! find?
  1375.       CALL RSPEAK(289)
  1376.       RETURN
  1377. C
  1378.       END
  1379.  
  1380. C NOBJS-        New objects processor
  1381. C
  1382. C Declarations
  1383. C
  1384.       LOGICAL FUNCTION NOBJS(RI,ARG)
  1385.       IMPLICIT INTEGER (A-Z)
  1386.       INCLUDE 'dparam.for'
  1387.       LOGICAL QOPEN,MOVETO,F,RMDESC
  1388.       LOGICAL QHERE,OPNCLS,MIRPAN
  1389.       LOGICAL LIT,WASLIT,QEMPTY
  1390. C
  1391. C Functions and data
  1392. C
  1393.       QOPEN(R)=(OFLAG2(R).AND.OPENBT).NE.0
  1394. C
  1395.       ODO2=0
  1396.       ODI2=0
  1397.       IF((PRSO.NE.0).AND.(PRSO.LE.OMAX)) ODO2=ODESC2(PRSO)
  1398.       IF(PRSI.NE.0) ODI2=ODESC2(PRSI)
  1399.       AV=AVEHIC(WINNER)
  1400.       NOBJS=.TRUE.
  1401.       WASLIT=LIT(HERE)
  1402. C
  1403.       GO TO (1000,2000,3000,4000,5000,6000,7000,8000,9000,
  1404.      110000,11000,12000,13000,14000,15000,16000,17000,
  1405.      218000,19000,20000,21000,22000,23000,24000,25000,
  1406.      326000,27000,28000,29000,30000,31000,32000,33000,
  1407.      434000,35000,36000,37000,38000,39000,40000,41000,
  1408.      542000,43000,44000,45000,46000),
  1409.      6(RI-31)
  1410.       CALL BUG(6,RI)
  1411. C
  1412. C Return here to declare false result.
  1413. C
  1414. 10    NOBJS=.FALSE.
  1415.       RETURN
  1416. C
  1417. C Return here to test for light source change.
  1418. C
  1419. 50    IF(WASLIT.AND..NOT.LIT(HERE)) CALL RSPEAK(406)
  1420.       RETURN
  1421.  
  1422. C NOBJS, PAGE 3
  1423. C
  1424. C O32-- Bills
  1425. C
  1426. 1000  IF(PRSA.NE.EATW) GO TO 1100               ! eat?
  1427.       CALL RSPEAK(639)                          ! joke.
  1428.       RETURN
  1429. C
  1430. 1100  IF(PRSA.EQ.BURNW) CALL RSPEAK(640)        ! burn?  joke.
  1431.       GO TO 10                                  ! let it be handled.
  1432. C
  1433. C O33-- Screen of light
  1434. C
  1435. 2000  TARGET=SCOL                               ! target is scol.
  1436. 2100  IF(PRSO.NE.TARGET) GO TO 2400             ! prso eq target?
  1437.       IF((PRSA.NE.PUSHW).AND.(PRSA.NE.MOVEW).AND.
  1438.      1(PRSA.NE.TAKEW).AND.(PRSA.NE.RUBW)) GO TO 2200
  1439.       CALL RSPEAK(673)                          ! hand passes thru.
  1440.       RETURN
  1441. C
  1442. 2200  IF((PRSA.NE.KILLW).AND.(PRSA.NE.ATTACW).AND.
  1443.      1(PRSA.NE.MUNGW)) GO TO 2400               ! aggressive?
  1444.       CALL RSPSUB(674,ODI2)                     ! passes thru.
  1445.       RETURN
  1446. C
  1447. 2400  IF((PRSA.NE.THROWW).OR.(PRSI.NE.TARGET)) GO TO 10
  1448.       IF(HERE.EQ.BKBOX) GO TO 2600              ! thru scol?
  1449.       CALL NEWSTA(PRSO,0,BKBOX,0,0)             ! no, thru wall.
  1450.       CALL RSPSUB(675,ODO2)                     ! ends up in box room.
  1451.       CTICK(CEVSCL)=0                           ! cancel alarm.
  1452.       SCOLRM=0                                  ! reset scol room.
  1453.       GO TO 50                                  ! go see if now dark.
  1454. C
  1455. 2600  IF(SCOLRM.EQ.0) GO TO 2900                ! tried to go thru?
  1456.       CALL NEWSTA(PRSO,0,SCOLRM,0,0)            ! success.
  1457.       CALL RSPSUB(676,ODO2)                     ! ends up somewhere.
  1458.       CTICK(CEVSCL)=0                           ! cancel alarm.
  1459.       SCOLRM=0                                  ! reset scol room.
  1460.       GO TO 50                                  ! go see if now dark.
  1461. C
  1462. 2900  CALL RSPEAK(213)                          ! cant do it.
  1463.       RETURN
  1464.  
  1465. C NOBJS, PAGE 4
  1466. C
  1467. C O34-- Gnome of Zurich
  1468. C
  1469. 3000  IF((PRSA.NE.GIVEW).AND.(PRSA.NE.THROWW)) GO TO 3200
  1470.       IF(OTVAL(PRSO).NE.0) GO TO 3100           ! throw a treasure?
  1471.       IF((PRSO.NE.BRICK).OR.(OCAN(FUSE).NE.BRICK).OR.
  1472.      1(CTICK(CEVFUS).EQ.0)) GO TO 3050  ! a bomb?
  1473.       CALL NEWSTA(ZGNOM,931,0,0,0)              ! gnome leaves.
  1474.       CALL NEWSTA(BRICK,0,HERE,0,0)             ! brick on floor.
  1475.       CFLAG(CEVZGO)=.FALSE.                     ! stop gnome timers.
  1476.       CFLAG(CEVZGI)=.FALSE.
  1477.       RETURN
  1478. C
  1479. 3050  CALL NEWSTA(PRSO,641,0,0,0)               ! no, go pop.
  1480.       RETURN
  1481. C
  1482. 3100  CALL NEWSTA(PRSO,0,0,0,0)                 ! yes, bye bye treasure.
  1483.       CALL RSPSUB(642,ODO2)
  1484.       CALL NEWSTA(ZGNOM,0,0,0,0)                ! bye bye gnome.
  1485.       CFLAG(CEVZGO)=.FALSE.                     ! cancel exit.
  1486.       F=MOVETO(BKENT,WINNER)                    ! now in bank entrance.
  1487.       RETURN
  1488. C
  1489. 3200  IF((PRSA.NE.ATTACW).AND.(PRSA.NE.KILLW).AND.
  1490.      1(PRSA.NE.MUNGW)) GO TO 3300               ! aggressive?
  1491.       CALL NEWSTA(ZGNOM,643,0,0,0)              ! vanish gnome.
  1492.       CFLAG(CEVZGO)=.FALSE.                     ! cancel exit.
  1493.       RETURN
  1494. C
  1495. 3300  CALL RSPEAK(644)                          ! gnome is impatient.
  1496.       RETURN
  1497. C
  1498. C O35-- Egg
  1499. C
  1500. 4000  IF((PRSA.NE.OPENW).OR.(PRSO.NE.EGG)) GO TO 4500
  1501.       IF(.NOT.QOPEN(EGG)) GO TO 4100            ! open already?
  1502.       CALL RSPEAK(649)                          ! yes.
  1503.       RETURN
  1504. C
  1505. 4100  IF(PRSI.NE.0) GO TO 4200                  ! with something?
  1506.       CALL RSPEAK(650)                          ! no, cant.
  1507.       RETURN
  1508. C
  1509. 4200  IF(PRSI.NE.HANDS) GO TO 4300              ! with hands?
  1510.       CALL RSPEAK(651)                          ! not recommended.
  1511.       RETURN
  1512. C
  1513. 4300  I=652                                     ! mung message.
  1514.       IF(((OFLAG1(PRSI).AND.TOOLBT).NE.0).OR.
  1515.      1((OFLAG2(PRSI).AND.WEAPBT).NE.0)) GO TO 4600
  1516.       I=653                                     ! novelty 1.
  1517.       IF((OFLAG2(PRSO).AND.FITEBT).NE.0) I=654  ! novelty 2.
  1518.       OFLAG2(PRSO)=OFLAG2(PRSO).OR.FITEBT
  1519.       CALL RSPSUB(I,ODI2)
  1520.       RETURN
  1521. C
  1522. 4500  IF(PRSA.NE.MUNGW) GO TO 10                ! mung?
  1523.       I=655                                     ! you blew it.
  1524. 4600  CALL NEWSTA(BEGG,I,OROOM(EGG),OCAN(EGG),OADV(EGG))
  1525.       CALL NEWSTA(EGG,0,0,0,0)                  ! vanish egg.
  1526.       IF(LASTIT.EQ.EGG) LASTIT=BEGG             ! fix last it reference.
  1527.       OTVAL(BEGG)=2                             ! bad egg has value.
  1528.       IF(OCAN(CANAR).NE.EGG) GO TO 4700         ! was canary inside?
  1529.       CALL RSPEAK(ODESCO(BCANA))                ! yes, describe result.
  1530.       OTVAL(BCANA)=1
  1531.       RETURN
  1532. C
  1533. 4700  CALL NEWSTA(BCANA,0,0,0,0)                ! no, vanish it.
  1534.       RETURN
  1535.  
  1536. C NOBJS, PAGE 5
  1537. C
  1538. C O36-- Canaries, good and bad
  1539. C
  1540. 5000  IF(PRSA.NE.WINDW) GO TO 10                ! wind em up?
  1541.       IF(PRSO.EQ.CANAR) GO TO 5100              ! right one?
  1542.       CALL RSPEAK(645)                          ! no, bad news.
  1543.       RETURN
  1544. C
  1545. 5100  IF(.NOT.SINGSF.AND.((HERE.EQ.MTREE).OR.
  1546.      1((HERE.GE.FORE1).AND.(HERE.LT.CLEAR))))
  1547.      2GO TO 5200                                ! first song in for?
  1548.       CALL RSPEAK(646)                          ! no, mediocre news.
  1549.       RETURN
  1550. C
  1551. 5200  SINGSF=.TRUE.                             ! sang song.
  1552.       CALL NEWSTA(BAUBL,647,HERE,0,0)           ! place bauble.
  1553.       IF(HERE.EQ.MTREE) CALL NEWSTA(BAUBL,0,FORE3,0,0)
  1554.       RETURN
  1555. C
  1556. C O37-- White cliffs
  1557. C
  1558. 6000  IF((PRSA.NE.CLMBW).AND.(PRSA.NE.CLMBUW).AND.
  1559.      1(PRSA.NE.CLMBDW)) GO TO 10                ! climb?
  1560.       CALL RSPEAK(648)                          ! oh yeah?
  1561.       RETURN
  1562. C
  1563. C O38-- Wall 
  1564. C
  1565. 7000  IF((IABS(HERE-MLOC).NE.1).OR.(MRHERE(HERE).NE.0).OR.
  1566.      1.NOT.ENDGMF) GO TO 7100                   ! mirror wall in endgame?
  1567.       IF(PRSA.NE.PUSHW) GO TO 10                ! pushed?
  1568.       CALL RSPEAK(860)                          ! pushed mirror wall.
  1569.       RETURN
  1570. C
  1571. 7100  IF((RFLAG(HERE).AND.RNWALL).EQ.0) GO TO 10
  1572.       CALL RSPEAK(662)                          ! no wall.
  1573.       RETURN
  1574.  
  1575. C NOBJS, PAGE 6
  1576. C
  1577. C O39-- Global bird
  1578. C
  1579. 8000  IF(PRSA.NE.FINDW) GO TO 8100              ! find?
  1580.       CALL RSPEAK(666)
  1581.       RETURN
  1582. C
  1583. 8100  IF(PRSA.NE.EXAMIW) GO TO 10               ! examine?
  1584.       CALL RSPEAK(667)
  1585.       RETURN
  1586. C
  1587. C O40-- Puzzle/Scol walls
  1588. C
  1589. 9000  IF(HERE.NE.CPUZZ) GO TO 9500              ! puzzle walls?
  1590.       IF(PRSA.NE.PUSHW) GO TO 10                ! push?
  1591.       DO 9100 I=1,8,2                           ! locate wall.
  1592.         IF(PRSO.EQ.CPWL(I)) GO TO 9200
  1593. 9100  CONTINUE
  1594.       CALL BUG(80,PRSO)                         ! what?
  1595. C
  1596. 9200  J=CPWL(I+1)                               ! get directional offset.
  1597.       NXT=CPHERE+J                              ! get next state.
  1598.       WL=CPVEC(NXT)                             ! get c(next state).
  1599.       GO TO (9300,9300,9300,9250,9350),(WL+4)   ! process.
  1600. C
  1601. 9250  CALL RSPEAK(876)                          ! clear corridor.
  1602.       RETURN
  1603. C
  1604. 9300  IF(CPVEC(NXT+J).EQ.0) GO TO 9400          ! movable, room to move?
  1605. 9350  CALL RSPEAK(877)                          ! immovable, no room.
  1606.       RETURN
  1607. C
  1608. 9400  I=878                                     ! assume first push.
  1609.       IF(CPUSHF) I=879                          ! not?
  1610.       CPUSHF=.TRUE.
  1611.       CPVEC(NXT+J)=WL                           ! move wall.
  1612.       CPVEC(NXT)=0                              ! vacate next state.
  1613.       CALL CPGOTO(NXT)                          ! onward.
  1614.       CALL CPINFO(I,NXT)                        ! describe.
  1615.       CALL PRINCR(.TRUE.,HERE)                  ! print rooms contents.
  1616.       RETURN
  1617. C
  1618. 9500  IF(HERE.NE.SCOLAC) GO TO 9700             ! in scol active room?
  1619.       DO 9600 I=1,12,3
  1620.         TARGET=SCOLWL(I+1)                      ! assume target.
  1621.         IF(SCOLWL(I).EQ.HERE) GO TO 2100        ! treat if found.
  1622. 9600  CONTINUE
  1623. C
  1624. 9700  IF(HERE.NE.BKBOX) GO TO 10                ! in box room?
  1625.       TARGET=WNORT
  1626.       GO TO 2100
  1627.  
  1628. C NOBJS, PAGE 7
  1629. C
  1630. C O41-- Short pole
  1631. C
  1632. 10000 IF(PRSA.NE.RAISEW) GO TO 10100            ! lift?
  1633.       I=749                                     ! assume up.
  1634.       IF(POLEUF.EQ.2) I=750                     ! already up?
  1635.       CALL RSPEAK(I)
  1636.       POLEUF=2                                  ! pole is raised.
  1637.       RETURN
  1638. C
  1639. 10100 IF((PRSA.NE.LOWERW).AND.(PRSA.NE.PUSHW)) GO TO 10
  1640.       IF(POLEUF.NE.0) GO TO 10200               ! already lowered?
  1641.       CALL RSPEAK(751)                          ! cant do it.
  1642.       RETURN
  1643. C
  1644. 10200 IF(MOD(MDIR,180).NE.0) GO TO 10300        ! mirror n-s?
  1645.       POLEUF=0                                  ! yes, lower into
  1646.       CALL RSPEAK(752)                          ! channel.
  1647.       RETURN
  1648. C
  1649. 10300 IF((MDIR.NE.270).OR.(MLOC.NE.MRB)) GO TO 10400
  1650.       POLEUF=0                                  ! lower into hole.
  1651.       CALL RSPEAK(753)
  1652.       RETURN
  1653. C
  1654. 10400 CALL RSPEAK(753+POLEUF)                   ! poleuf = 1 or 2.
  1655.       POLEUF=1                                  ! now on floor.
  1656.       RETURN
  1657. C
  1658. C O42-- Mirror switch
  1659. C
  1660. 11000 IF(PRSA.NE.PUSHW) GO TO 10                ! push?
  1661.       IF(MRPSHF) GO TO 11300                    ! already pushed?
  1662.       CALL RSPEAK(756)                          ! button goes in.
  1663.       DO 11100 I=1,OLNT                         ! blocked?
  1664.         IF(QHERE(I,MREYE).AND.(I.NE.RBEAM)) GO TO 11200
  1665. 11100 CONTINUE
  1666.       CALL RSPEAK(757)                          ! nothing in beam.
  1667.       RETURN
  1668. C
  1669. 11200 CFLAG(CEVMRS)=.TRUE.                      ! mirror opens.
  1670.       CTICK(CEVMRS)=7
  1671.       MRPSHF=.TRUE.
  1672.       MROPNF=.TRUE.
  1673.       RETURN
  1674. C
  1675. 11300 CALL RSPEAK(758)                          ! mirror already open.
  1676.       RETURN
  1677.  
  1678. C NOBJS, PAGE 8
  1679. C
  1680. C O43-- Beam function
  1681. C
  1682. 12000 IF((PRSA.NE.TAKEW).OR.(PRSO.NE.RBEAM)) GO TO 12100
  1683.       CALL RSPEAK(759)                          ! take beam, joke.
  1684.       RETURN
  1685. C
  1686. 12100 I=PRSO                                    ! assume blk with dirobj.
  1687.       IF((PRSA.EQ.PUTW).AND.(PRSI.EQ.RBEAM)) GO TO 12200
  1688.       IF((PRSA.NE.MUNGW).OR.(PRSO.NE.RBEAM).OR.
  1689.      1(PRSI.EQ.0)) GO TO 10                     ! break beam with x?
  1690.       I=PRSI
  1691. 12200 IF(OADV(I).NE.WINNER) GO TO 12300         ! carrying?
  1692.       CALL NEWSTA(I,0,HERE,0,0)                 ! drop obj.
  1693.       CALL RSPSUB(760,ODESC2(I))
  1694.       RETURN
  1695. C
  1696. 12300 J=761                                     ! assume not in room.
  1697.       IF(QHERE(I,HERE)) J=762                   ! in room?
  1698.       CALL RSPSUB(J,ODESC2(I))                  ! describe.
  1699.       RETURN
  1700. C
  1701. C O44-- Bronze door
  1702. C
  1703. 13000 IF((HERE.EQ.NCELL).OR.((LCELL.EQ.4).AND.
  1704.      1((HERE.EQ.CELL).OR.(HERE.EQ.SCORR))))
  1705.      2GO TO 13100
  1706.       CALL RSPEAK(763)                          ! door not there.
  1707.       RETURN
  1708. C
  1709. 13100 IF(.NOT.OPNCLS(ODOOR,764,765)) GO TO 10   ! open/close?
  1710.       IF((HERE.EQ.NCELL).AND.QOPEN(ODOOR))
  1711.      1CALL RSPEAK(766)                          ! descr view.
  1712.       RETURN
  1713. C
  1714. C O45-- Quiz door
  1715. C
  1716. 14000 IF((PRSA.NE.OPENW).AND.(PRSA.NE.CLOSEW)) GO TO 14100
  1717.       CALL RSPEAK(767)                          ! door wont move.
  1718.       RETURN
  1719. C
  1720. 14100 IF(PRSA.NE.KNOCKW) GO TO 10               ! knock?
  1721.       IF(INQSTF) GO TO 14200                    ! tried it already?
  1722.       INQSTF=.TRUE.                             ! start inquisition.
  1723.       CFLAG(CEVINQ)=.TRUE.
  1724.       CTICK(CEVINQ)=2
  1725.       QUESNO=RND(8)                             ! select question.
  1726.       NQATT=0
  1727.       CORRCT=0
  1728.       CALL RSPEAK(768)                          ! announce rules.
  1729.       CALL RSPEAK(769)
  1730.       CALL RSPEAK(770+QUESNO)                   ! ask question.
  1731.       RETURN
  1732. C
  1733. 14200 CALL RSPEAK(798)                          ! no reply.
  1734.       RETURN
  1735. C
  1736. C O46-- Locked door
  1737. C
  1738. 15000 IF(PRSA.NE.OPENW) GO TO 10                ! open?
  1739.       CALL RSPEAK(778)                          ! cant.
  1740.       RETURN
  1741. C
  1742. C O47-- Cell door
  1743. C
  1744. 16000 NOBJS=OPNCLS(CDOOR,779,780)               ! open/close?
  1745.       RETURN
  1746.  
  1747. C NOBJS, PAGE 9
  1748. C
  1749. C O48-- Dialbutton
  1750. C
  1751. 17000 IF(PRSA.NE.PUSHW) GO TO 10                ! push?
  1752.       CALL RSPEAK(809)                          ! click.
  1753.       IF(QOPEN(CDOOR)) CALL RSPEAK(810)         ! close cell door.
  1754.       OFLAG2(CDOOR)=OFLAG2(CDOOR).AND. .NOT.OPENBT
  1755.       OFLAG2(ODOOR)=OFLAG2(ODOOR).AND. .NOT.OPENBT
  1756.       IF(LCELL.EQ.PNUMB) RETURN                 ! any change?
  1757. C
  1758.       DO 17100 I=1,OLNT                         ! relocate old to hyper.
  1759.         IF((OROOM(I).EQ.CELL).AND.((OFLAG1(I).AND.DOORBT).EQ.0))
  1760.      1CALL NEWSTA(I,0,LCELL*HFACTR,0,0)
  1761.         IF(OROOM(I).EQ.(PNUMB*HFACTR))
  1762.      1CALL NEWSTA(I,0,CELL,0,0)                 ! move in new hyper.
  1763. 17100 CONTINUE
  1764. C
  1765.       OFLAG1(ODOOR)=OFLAG1(ODOOR).AND. .NOT.VISIBT
  1766.       IF(PNUMB.EQ.4) OFLAG1(ODOOR)=OFLAG1(ODOOR).OR.VISIBT
  1767. C
  1768.       IF(AROOM(PLAYER).NE.CELL) GO TO 17400     ! player in cell?
  1769.       IF(LCELL.NE.4) GO TO 17200                ! in right cell?
  1770.       OFLAG1(ODOOR)=OFLAG1(ODOOR).OR. VISIBT
  1771.       F=MOVETO(NCELL,PLAYER)                    ! yes, moveto ncell.
  1772.       GO TO 17400
  1773. 17200 F=MOVETO(PCELL,PLAYER)                    ! no, moveto pcell.
  1774. C
  1775. 17400 LCELL=PNUMB
  1776.       RETURN
  1777.  
  1778. C NOBJS, PAGE 10
  1779. C
  1780. C O49-- Dial indicator
  1781. C
  1782. 18000 IF(PRSA.NE.SPINW) GO TO 18100             ! spin?
  1783.       PNUMB=RND(8)+1                            ! whee!
  1784.       CALL RSPSUB(797,712+PNUMB)
  1785.       RETURN
  1786. C
  1787. 18100 IF((PRSA.NE.MOVEW).AND.(PRSA.NE.PUTW).AND.
  1788.      1(PRSA.NE.TRNTOW)) GO TO 10
  1789.       IF(PRSI.NE.0) GO TO 18200                 ! turn dial to x?
  1790.       CALL RSPEAK(806)                          ! must specify.
  1791.       RETURN
  1792. C
  1793. 18200 IF((PRSI.GE.NUM1).AND.(PRSI.LE.NUM8)) GO TO 18300
  1794.       CALL RSPEAK(807)                          ! must be digit.
  1795.       RETURN
  1796. C
  1797. 18300 PNUMB=PRSI-NUM1+1                         ! set up new.
  1798.       CALL RSPSUB(808,712+PNUMB)
  1799.       RETURN
  1800. C
  1801. C O50-- Global mirror
  1802. C
  1803. 19000 NOBJS=MIRPAN(832,.FALSE.)
  1804.       RETURN
  1805. C
  1806. C O51-- Global panel
  1807. C
  1808. 20000 IF(HERE.NE.FDOOR) GO TO 20100             ! at front door?
  1809.       IF((PRSA.NE.OPENW).AND.(PRSA.NE.CLOSEW)) GO TO 10
  1810.       CALL RSPEAK(843)                          ! panel in door, nogo.
  1811.       RETURN
  1812. C
  1813. 20100 NOBJS=MIRPAN(838,.TRUE.)
  1814.       RETURN
  1815. C
  1816. C O52-- Puzzle Room slit
  1817. C
  1818. 21000 IF((PRSA.NE.PUTW).OR.(PRSI.NE.CSLIT)) GO TO 10
  1819.       IF(PRSO.NE.GCARD) GO TO 21100             ! put card in slit?
  1820.       CALL NEWSTA(PRSO,863,0,0,0)               ! kill card.
  1821.       CPOUTF=.TRUE.                             ! open door.
  1822.       RETURN
  1823. C
  1824. 21100 IF(((OFLAG1(PRSO).AND.VICTBT).EQ.0).AND.
  1825.      1 ((OFLAG2(PRSO).AND.VILLBT).EQ.0)) GO TO 21200
  1826.       CALL RSPEAK(552+RND(6))                   ! joke for vill, vict.
  1827.       RETURN
  1828. C
  1829. 21200 CALL NEWSTA(PRSO,0,0,0,0)                 ! kill object.
  1830.       CALL RSPSUB(864,ODO2)                     ! describe.
  1831.       RETURN
  1832.  
  1833. C NOBJS, PAGE 11
  1834. C
  1835. C O53-- Global brochure or stamp
  1836. C
  1837. 22000 IF(PRSO.NE.STAMP) GO TO 22100             ! stamp?
  1838.       IF(PRSA.EQ.TAKEW) OFLAG1(BROCH)=OFLAG1(BROCH).AND..NOT.CONTBT
  1839.       GO TO 10                                  ! do normal take.
  1840. C
  1841. 22100 IF((PRSO.NE.BROCH).OR.
  1842.      1 ((PRSA.NE.EXAMIW).AND.(PRSA.NE.READW)))
  1843.      2 GO TO 22200                              ! examine brochure?
  1844.       CALL RSPEAK(942)                          ! describe.
  1845.       IF(OCAN(STAMP).EQ.BROCH) CALL RSPEAK(943)
  1846.       RETURN
  1847. C
  1848. 22200 IF((PRSA.NE.FINDW).OR..NOT.BROC1F) GO TO 22300
  1849.       CALL RSPEAK(944)                          ! on the way.
  1850.       RETURN
  1851. C
  1852. 22300 IF(PRSA.NE.SENDW) GO TO 22400             ! send?
  1853.       IF(BROC2F) CALL RSPEAK(945)               ! already got it.
  1854.       IF(BROC1F.AND..NOT.BROC2F) CALL RSPEAK(944) ! on the way.
  1855.       IF(.NOT.BROC1F) CALL RSPEAK(947)          ! postal service.
  1856.       BROC1F=.TRUE.                             ! send for brochure.
  1857.       RETURN
  1858. C
  1859. 22400 IF(PRSO.NE.GBROCH) GO TO 10               ! global brochure?
  1860.       CALL RSPEAK(1071)                         ! pretend it's not there.
  1861.       RETURN
  1862. C
  1863. C O54-- Global ground
  1864. C
  1865. 23000 IF(HERE.EQ.SBEACH) GO TO 36000            ! at sandy beach? then sand.
  1866.       IF(PRSA.NE.DIGW) GO TO 10                 ! dig?
  1867.       CALL RSPEAK(924)                          ! can't do it.
  1868.       RETURN
  1869. C
  1870. C O55-- Global granite wall
  1871. C
  1872. 24000 I=916                                     ! joke for take.
  1873.       IF(PRSA.EQ.TAKEW) GO TO 24100             ! take?
  1874.       I=918                                     ! temple, treasure find.
  1875.       IF(HERE.EQ.SLIDE) I=917                   ! slide find.
  1876.       IF(PRSA.NE.FINDW) GO TO 10                ! find?
  1877. 24100 CALL RSPEAK(I)                            ! tell all.
  1878.       RETURN
  1879.  
  1880. C NOBJS, PAGE 12
  1881. C
  1882. C O56-- Global house
  1883. C
  1884. 25000 IF((HERE.GE.WHOUS).AND.(HERE.LE.EHOUS)) GO TO 25200
  1885.       IF(PRSA.NE.FINDW) GO TO 25100             ! find, not at house?
  1886.       I=892                                     ! joke 1.
  1887.       IF(HERE.EQ.CLEAR) I=893                   ! joke 2 for clearing.
  1888.       CALL RSPEAK(I)
  1889.       RETURN
  1890. C
  1891. 25100 CALL RSPEAK(894)                          ! not there.
  1892.       RETURN
  1893. C
  1894. 25200 IF(PRSA.NE.FINDW) GO TO 25300             ! find, at house?
  1895.       CALL RSPEAK(895)                          ! right there.
  1896.       RETURN
  1897. C
  1898. 25300 IF(PRSA.NE.EXAMIW) GO TO 25400            ! look at?
  1899.       CALL RSPEAK(896)                          ! a nice house.
  1900.       RETURN
  1901. C
  1902. 25400 IF(PRSA.NE.BURNW) GO TO 25500             ! burn?
  1903.       CALL RSPEAK(897)                          ! bad boy.
  1904.       RETURN
  1905. C
  1906. 25500 IF(PRSA.NE.GTHROW) GO TO 10               ! go through?
  1907.       IF(HERE.EQ.EHOUS) GO TO 25600             ! at east side?
  1908.       CALL RSPEAK(898)                          ! can't do it
  1909.       RETURN
  1910. C
  1911. 25600 IF(QOPEN(WINDO)) GO TO 25700              ! window open?
  1912.       CALL RSPEAK(899)                          ! no, shut
  1913.       RETURN
  1914. C
  1915. 25700 F=MOVETO(KITCH,WINNER)                    ! move into kitchen.
  1916.       F=RMDESC(0)                               ! describe room
  1917.       RETURN
  1918. C
  1919. C O57-- Barred window in white house
  1920. C
  1921. 26000 IF((PRSA.NE.OPENW).AND.(PRSA.NE.LOOKIW).AND.
  1922.      1 (PRSA.NE.GTHROW)) GO TO 26100    ! open, look in, enter?
  1923.       CALL RSPEAK(1039)                         ! window barred.
  1924.       RETURN
  1925. C
  1926. 26100 IF(PRSA.NE.CLOSEW) GO TO 10               ! close?
  1927.       CALL RSPEAK(1040)                         ! already closed and locked.
  1928.       RETURN
  1929.  
  1930. C NOBJS, PAGE 13
  1931. C
  1932. C O58-- Global well
  1933. C
  1934. 27000 IF(((OFLAG1(PRSO).AND.TAKEBT).EQ.0).OR.(PRSO.EQ.WATER).OR.
  1935.      1 ((PRSA.NE.THROWW).AND.(PRSA.NE.PUTW).AND.(PRSA.NE.DROPW)))
  1936.      2 GO TO 10                                 ! throw, put, drop x in well?
  1937.       CALL RSPSUB(939,ODO2)
  1938.       CALL NEWSTA(PRSO,0,BWELL,0,0)             ! put in well bottom.
  1939.       GO TO 50                                  ! go see if now dark.
  1940. C
  1941. C O59-- Global rope
  1942. C
  1943. 28000 IF(PRSA.NE.TAKEW) GO TO 28100             ! take?
  1944.       CALL RSPEAK(1006)                         ! not a good idea.
  1945.       RETURN
  1946. C
  1947. 28100 IF(PRSA.NE.DROPW) GO TO 28300             ! drop?
  1948.       CALL RSPEAK(1007)                         ! you lose.
  1949. 28200 F=MOVETO(CELLA,WINNER)                    ! drop into cellar.
  1950.       F=RMDESC(3)                               ! describe.
  1951.       RETURN
  1952. C
  1953. 28300 IF((PRSA.EQ.CLMBW).OR.(PRSA.EQ.CLMBUW).OR.
  1954.      1 (PRSA.EQ.CLMBDW)) GO TO 10               ! normal climb.
  1955.       CALL RSPEAK(1008)                         ! not a good idea.
  1956.       RETURN
  1957. C
  1958. C O60-- Global slide
  1959. C
  1960. 29000 IF((PRSA.NE.GTHROW).AND.
  1961.      1((PRSA.NE.PUTW).OR.(PRSO.NE.AOBJ(PLAYER)))) GO TO 29100
  1962.       CALL RSPEAK(1010)                         ! down the slide.
  1963.       GO TO 28200
  1964. C
  1965. 29100 IF(PRSA.NE.PUTW) GO TO 10                 ! put in slide?
  1966.       IF((OFLAG1(PRSO).AND.TAKEBT).NE.0) GO TO 29200
  1967.       CALL RSPEAK(552+RND(6))                   ! can't take it.
  1968.       RETURN
  1969. C
  1970. 29200 IF(PRSO.NE.TTIE) GO TO 29300              ! tied object?
  1971.       OFLAG1(TTIE)=OFLAG1(TTIE).AND..NOT.NDSCBT
  1972.       OFLAG1(ROPE)=OFLAG1(ROPE).AND..NOT.NDSCBT
  1973.       OFLAG2(ROPE)=OFLAG2(ROPE).AND..NOT.CLMBBT
  1974.       ODESC1(TIMBE)=1032                        ! restored untied desc.
  1975.       ODESC1(COFFI)=1033
  1976.       TTIE=0                                    ! not tied any more.
  1977.       CALL NEWSTA(ROPE,0,CELLA,0,0)             ! rope is now here.
  1978. 29300 CALL RSPSUB(1011,ODO2)
  1979.       CALL NEWSTA(PRSO,0,CELLA,0,0)             ! put in cellar,
  1980.       IF(PRSO.EQ.WATER) CALL NEWSTA(PRSO,0,0,0,0) ! unless water.
  1981.       GO TO 50                                  ! go see if now dark.
  1982.  
  1983. C NOBJS, PAGE 14
  1984. C
  1985. C O61-- Barrel
  1986. C
  1987. 30000 IF(ARG.NE.1) GO TO 10                     ! read in?
  1988.       I=0                                       ! default.
  1989.       IF(PRSA.EQ.WALKW) I=920                   ! walk?
  1990.       IF(PRSA.EQ.LOOKW) I=921                   ! look?
  1991.       IF(PRSA.EQ.BURNW) I=922                   ! burn?
  1992.       IF(PRSA.EQ.TAKEW) I=552+RND(6)            ! take?
  1993.       CALL RSPEAK(I)
  1994.       NOBJS=I.NE.0                              ! handled?
  1995.       RETURN
  1996. C
  1997. C O62-- Hot bell
  1998. C
  1999. 31000 IF(PRSA.NE.TAKEW) GO TO 31100             ! take?
  2000.       CALL RSPEAK(972)                          ! too hot.
  2001.       RETURN
  2002. C
  2003. 31100 IF(PRSA.NE.RINGW) GO TO 31400             ! ring?
  2004.       IF(PRSI.NE.0) GO TO 31200                 ! with something?
  2005.       CALL RSPEAK(973)                          ! too hot.
  2006.       RETURN
  2007. C
  2008. 31200 IF((OFLAG1(PRSI).AND.BURNBT).EQ.0) GO TO 31300
  2009.       CALL RSPSUB(974,ODI2)                     ! burnable is consumed.
  2010.       CALL NEWSTA(PRSI,0,0,0,0)                 ! vanish it.
  2011.       RETURN
  2012. C
  2013. 31300 I=975                                     ! joke 1.
  2014.       IF(PRSI.EQ.HANDS) I=973                   ! joke for hands.
  2015.       CALL RSPEAK(I)
  2016.       RETURN
  2017. C
  2018. 31400 IF(PRSA.NE.PORONW) GO TO 10               ! pour on?
  2019.       CALL NEWSTA(HBELL,0,0,0,0)                ! vanish bell.
  2020.       CALL NEWSTA(BELL,976,LLD1,0,0)            ! insert real bell.
  2021.       IF(LASTIT.EQ.HBELL) LASTIT=BELL           ! fix last it reference.
  2022.       CALL NEWSTA(PRSO,0,0,0,0)                 ! vanish water.
  2023.       CTICK(CEVXBH)=0                           ! cancel cooling.
  2024.       RETURN
  2025. C
  2026. C O63-- Axe
  2027. C
  2028. 32000 IF(PRSA.NE.TAKEW) GO TO 10                ! take?
  2029.       CALL RSPEAK(891)                          ! too hot.
  2030.       RETURN
  2031.  
  2032. C NOBJS, PAGE 15
  2033. C
  2034. C O64-- Timber (also coffin)
  2035. C
  2036. 33000 IF((PRSA.NE.TAKEW).OR.(PRSO.NE.TTIE)) GO TO 10
  2037.       CALL RSPSUB(1009,ODO2)                    ! rope becomes untied.
  2038.       OFLAG1(TTIE)=OFLAG1(TTIE).AND..NOT.NDSCBT
  2039.       OFLAG1(ROPE)=OFLAG1(ROPE).AND..NOT.NDSCBT
  2040.       OFLAG2(ROPE)=OFLAG2(ROPE).AND..NOT.CLMBBT
  2041.       ODESC1(TIMBE)=1032                        ! restored untied desc.
  2042.       ODESC1(COFFI)=1033
  2043.       TTIE=0                                    ! not tied any more.
  2044.       CALL NEWSTA(ROPE,0,HERE,0,0)              ! rope is now here.
  2045.       GO TO 10                                  ! don't handle.
  2046. C
  2047. C O65-- Guano
  2048. C
  2049. 34000 IF(PRSA.NE.DIGW) GO TO 10                 ! dig?
  2050.       RVGUA=MIN0(4,RVGUA+1)                     ! go to next state.     
  2051.       CALL RSPEAK(91+RVGUA)                     ! describe.
  2052.       RETURN
  2053. C
  2054. C O66-- Alice room leak
  2055. C
  2056. 35000 IF(PRSA.NE.TAKEW) GO TO 35100             ! take?
  2057.       CALL RSPEAK(552+RND(6))                   ! joke.
  2058.       RETURN
  2059. C
  2060. 35100 IF(PRSA.NE.PLUGW) GO TO 10                ! plug?
  2061.       CALL RSPEAK(929)                          ! can't reach.
  2062.       RETURN
  2063.  
  2064. C NOBJS, PAGE 16
  2065. C
  2066. C O67-- Sand
  2067. C
  2068. 36000 IF(PRSA.NE.DIGW) GO TO 10                 ! dig?
  2069.       RVSND=RVSND+1                             ! go to next state.
  2070.       GO TO (36100,36100,36100,36400,36500),RVSND ! process
  2071.       CALL BUG(2,RVSND)
  2072. C
  2073. 36100 CALL RSPEAK(85+RVSND)                     ! 1..3, describe.
  2074.       RETURN
  2075. C
  2076. 36400 IF((OFLAG1(STATU).AND.VISIBT).EQ.0) CALL RSPEAK(89)
  2077.       OFLAG1(STATU)=OFLAG1(STATU).OR.VISIBT     ! 4, statue appears.
  2078.       RETURN
  2079. C
  2080. 36500 RVSND=0                                   ! 5, sand collapses.
  2081.       IF(OROOM(STATU).EQ.HERE)
  2082.      1OFLAG1(STATU)=OFLAG1(STATU).AND..NOT.VISIBT
  2083.       CALL JIGSUP(90)                           ! gonzo.
  2084.       RETURN
  2085. C
  2086. C O68-- Torch
  2087. C
  2088. 37000 IF(PRSA.NE.TRNOFW) GO TO 10               ! extinguish?
  2089.       CALL RSPEAK(900)                          ! can't do it.
  2090.       RETURN
  2091. C
  2092. C O69-- Tool chests
  2093. C
  2094. 38000 IF(PRSA.NE.EXAMIW) GO TO 38100            ! examine?
  2095.       CALL RSPEAK(907)                          ! describe.
  2096.       RETURN
  2097. C
  2098. 38100 IF(PRSA.NE.TAKEW) GO TO 10                ! take?
  2099.       CALL RSPEAK(908)                          ! can't do it.
  2100.       RETURN
  2101.  
  2102. C NOBJS, PAGE 17
  2103. C
  2104. C O70-- Palantir door
  2105. C
  2106. 39000 IF((PRSA.NE.LOOKUW).OR..NOT.MATF) GO TO 39100
  2107.       CALL RSPEAK(995)                          ! mat under door.
  2108.       RETURN
  2109. C
  2110. 39100 IF(PRSA.NE.UNLOKW) GO TO 39500            ! unlock?
  2111.       IF(PRSI.NE.PKEY) GO TO 39400              ! with rusty key?
  2112. 39200 IF((OCAN(PKEY).EQ.(HERE-PRM+PKH1)).OR.
  2113.      1QEMPTY(HERE-PRM+PKH1)) GO TO 39300                ! keyhole empty?
  2114. 39250 CALL RSPEAK(991)                          ! no
  2115.       RETURN
  2116. C
  2117. 39300 CALL RSPEAK(996)                          ! now unlocked.
  2118.       PUNLKF=.TRUE.
  2119.       RETURN
  2120. C
  2121. 39400 I=997                                     ! joke 1.
  2122.       IF(PRSI.EQ.KEYS) I=998                    ! joke 2 for keys.
  2123.       CALL RSPEAK(I)
  2124.       RETURN
  2125. C
  2126. 39500 IF(PRSA.NE.LOCKW) GO TO 39700             ! lock?
  2127.       IF(PRSI.EQ.PKEY) GO TO 39600              ! with rusty key?
  2128.       CALL RSPEAK(999)                          ! no
  2129.       RETURN
  2130. C
  2131. 39600 IF((OCAN(PKEY).NE.(HERE-PRM+PKH1)).AND.
  2132.      1.NOT.QEMPTY(HERE-PRM+PKH1)) GO TO 39250
  2133.       CALL RSPEAK(1000)                         ! now locked.
  2134.       PUNLKF=.FALSE.
  2135.       RETURN
  2136. C
  2137. 39700 IF((PRSA.NE.PUTUNW).OR.((PRSO.NE.BLABE).AND.
  2138.      1 (PRSO.NE.LABEL).AND.(PRSO.NE.CARD).AND.
  2139.      2 (PRSO.NE.WARNI).AND.(PRSO.NE.RBTLB).AND.
  2140.      3 (PRSO.NE.GUIDE))) GO TO 39800    ! put small paper?
  2141.       CALL NEWSTA(PRSO,1001,HERE.XOR.1,0,0)     ! put in other room.
  2142.       RETURN
  2143. C
  2144. 39800 IF((PRSA.NE.OPENW).AND.(PRSA.NE.CLOSEW)) GO TO 10
  2145.       IF(.NOT.PUNLKF) GO TO 39900               ! open or close, unlocked?
  2146.       NOBJS=OPNCLS(PRSO,1002,1003)              ! open or close.
  2147.       RETURN
  2148. C
  2149. 39900 CALL RSPEAK(1000)                         ! door locked.
  2150.       RETURN
  2151. C
  2152. C O71-- Palantir window
  2153. C
  2154. 40000 IF(PRSA.NE.GTHROW) GO TO 40100            ! go through?
  2155.       CALL RSPEAK(1004)                         ! can't do it.
  2156.       RETURN
  2157. C
  2158. 40100 IF(PRSA.NE.LOOKIW) GO TO 10               ! look in?
  2159.       IF(QOPEN(PDOOR)) GO TO 40200              ! door open?
  2160.       PLOOKF=.TRUE.                             ! set window flag.
  2161.       SVFLAG=RFLAG(HERE.XOR.1)                  ! save room flags from other.
  2162.       F=MOVETO(HERE.XOR.1,WINNER)               ! go to other room.
  2163.       F=RMDESC(3)                               ! describe it.
  2164.       F=MOVETO(HERE.XOR.1,WINNER)               ! come back.
  2165.       RFLAG(HERE.XOR.1)=SVFLAG                  ! restore flags.
  2166.       RETURN
  2167. C
  2168. 40200 CALL RSPEAK(1005)                         ! door open, dummy.
  2169.       RETURN
  2170.  
  2171. C NOBJS, PAGE 18
  2172. C
  2173. C O72-- Keyhole lids
  2174. C
  2175. 41000 IF((PRSA.NE.OPENW).AND.(PRSA.NE.RAISEW)) GO TO 41100
  2176.       CALL RSPEAK(985)                          ! open lid.
  2177.       OFLAG2(PRSO)=OFLAG2(PRSO).OR.OPENBT
  2178.       RETURN
  2179. C
  2180. 41100 IF((PRSA.NE.CLOSEW).AND.(PRSA.NE.LOWERW)) GO TO 10
  2181.       IF(QEMPTY(PRSO-PLID1+PKH1)) GO TO 41200    ! keyhole empty?
  2182.       CALL RSPEAK(986)                          ! can't do it.
  2183.       RETURN
  2184. C
  2185. 41200 CALL RSPEAK(987)                          ! close lid.
  2186.       OFLAG2(PRSO)=OFLAG2(PRSO).AND..NOT.OPENBT
  2187.       RETURN
  2188. C
  2189. C O73-- Keyholes
  2190. C
  2191. 42000 IF(PRSA.NE.LOOKIW) GO TO 42200            ! look in?
  2192.       I=988                                     ! doesn't work.
  2193.       IF(QOPEN(PLID1).AND.QOPEN(PLID2).AND.
  2194.      1QEMPTY(PKH1).AND.QEMPTY(PKH2).AND.
  2195.      2LIT(HERE.XOR.1)) I=989                    ! does work
  2196.       CALL RSPEAK(I)
  2197.       RETURN
  2198. C
  2199. 42200 IF(PRSA.NE.PUTW) GO TO 10                 ! put?
  2200.       IF(QOPEN(PRSI-PKH1+PLID1)) GO TO 42300    ! lid open?
  2201.       CALL RSPEAK(990)                          ! no.
  2202.       RETURN
  2203. C
  2204. 42300 IF(QEMPTY(PRSI)) GO TO 42400              ! keyhole empty?
  2205.       CALL RSPEAK(991)                          ! no.
  2206.       RETURN
  2207. C
  2208. 42400 IF((PRSO.NE.SCREW).AND.(PRSO.NE.KEYS).AND.
  2209.      1 (PRSO.NE.STICK).AND.(PRSO.NE.PKEY)) GO TO 42700
  2210.       IF(QEMPTY(PRSI.XOR.1)) GO TO 10           ! nothing to shove.
  2211.       DO 42500 I=1,OLNT
  2212.         IF(OCAN(I).EQ.(PRSI.XOR.1)) GO TO 42600 ! find obj in keyhole.
  2213. 42500 CONTINUE
  2214.       CALL BUG(67,PRSI.XOR.1)
  2215. C
  2216. 42600 CALL NEWSTA(I,992,HERE.XOR.1,0,0)         ! obj falls to floor.
  2217.       IF(MATF) MATOBJ=I                         ! if mat, falls on that.
  2218.       GO TO 10                                  ! finish put.
  2219. C
  2220. 42700 CALL RSPSUB(993,ODO2)                     ! doesn't fit.
  2221.       RETURN
  2222.  
  2223. C NOBJS, PAGE 19
  2224. C
  2225. C O74-- Rusty key
  2226. C
  2227. 43000 IF(PRSA.NE.TURNW) GO TO 10                ! turn?
  2228.       IF(PUNLKF) GO TO 39600                    ! unlock?
  2229.       GO TO 39200                               ! otherwise lock.
  2230. C
  2231. C O75-- Palantirs
  2232. C
  2233. 44000 IF(PRSA.NE.LOOKIW) GO TO 10               ! look in?
  2234.       OBJ=PALAN                                 ! assume dest = palan.
  2235.       IF(PRSO.EQ.PALAN) OBJ=PAL3                ! if palan, then pal3.
  2236.       IF(PRSO.EQ.PAL3) OBJ=SPHER                ! if pal3, then sphere.
  2237.       J=HERE                                    ! save here.
  2238.       K=OCAN(OBJ)                               ! get dest container.
  2239.       IF(OROOM(OBJ).NE.0) J=OROOM(OBJ)          ! if dest in room, use.
  2240.       IF(K.NE.0) J=OROOM(K)                     ! if cont, use cont room.
  2241.       IF((J.EQ.0).OR.(OADV(OBJ).EQ.-THIEF)) GO TO 44200
  2242.       IF(.NOT.LIT(J)) GO TO 44200               ! see destination?
  2243.       IF(K.EQ.0) GO TO 44100                    ! contained?
  2244.       IF(((OFLAG1(K).AND.TRANBT).EQ.0).AND..NOT.QOPEN(K))
  2245.      1GO TO 44200                               ! see out of it?
  2246. 44100 CALL RSPEAK(1024)                         ! start vision.
  2247.       OFLAG1(OBJ)=OFLAG1(OBJ).AND..NOT.VISIBT   ! object not visible.
  2248.       SVHERE=HERE                               ! save state.
  2249.       SVFLAG=RFLAG(J)
  2250.       F=MOVETO(J,WINNER)                        ! move to new room.
  2251.       F=RMDESC(3)                               ! describe.
  2252.       IF(J.EQ.SVHERE) CALL RSPEAK(1026)         ! was it here?
  2253.       F=MOVETO(SVHERE,WINNER)                   ! come back.
  2254.       RFLAG(J)=SVFLAG                           ! restore flags.
  2255.       OFLAG1(OBJ)=OFLAG1(OBJ).OR.VISIBT         ! restore object.
  2256.       RETURN
  2257. C
  2258. 44200 CALL RSPEAK(1023)                         ! nothing to see.
  2259.       RETURN
  2260. C
  2261. C O76-- Mat
  2262. C
  2263. 45000 IF((PRSA.NE.PUTUNW).OR.(PRSI.NE.PDOOR)) GO TO 45100
  2264.       MATF=.TRUE.                               ! put under right door.
  2265.       CALL NEWSTA(PRSO,983,HERE,0,0)
  2266.       RETURN
  2267. C
  2268. 45100 IF(((PRSA.NE.TAKEW).AND.(PRSA.NE.MOVEW)).OR.(MATOBJ.EQ.0)) 
  2269.      1GO TO 10                                  ! take or move?
  2270.       CALL NEWSTA(MATOBJ,0,HERE,0,0)            ! materialize mat object.
  2271.       CALL RSPSUB(984,ODESC2(MATOBJ))
  2272.       MATOBJ=0
  2273.       MATF=.FALSE.
  2274.       IF(PRSA.EQ.TAKEW) GO TO 10                ! do normal take.
  2275.       RETURN                                    ! move is done.
  2276. C
  2277. C O77-- Stove
  2278. C
  2279. 46000 IF((PRSA.NE.TAKEW).AND.(PRSA.NE.RUBW).AND.
  2280.      1 (PRSA.NE.ATTACW).AND.(PRSA.NE.MUNGW))
  2281.      2 GO TO 46100                              ! take, feel, attack, mung?
  2282.       CALL RSPEAK(994)                          ! too hot.
  2283.       RETURN
  2284. C
  2285. 46100 IF(PRSA.NE.THROWW) GO TO 10               ! throw at stove?
  2286.       IF(PRSO.NE.WATER) GO TO 46200             ! water?
  2287.       CALL NEWSTA(WATER,978,0,0,0)              ! evaporates.
  2288.       RETURN
  2289. C
  2290. 46200 IF((OFLAG1(PRSO).AND.BURNBT).EQ.0) GO TO 10 ! burnable?
  2291.       CALL RSPSUB(974,ODO2)                     ! burns up.
  2292.       CALL NEWSTA(PRSO,0,0,0,0)                 ! vanishes.
  2293.       RETURN
  2294. C
  2295.       END
  2296.  
  2297. C MIRPAN--      Processor for global mirror/panel
  2298. C
  2299. C Declarations
  2300. C
  2301.       LOGICAL FUNCTION MIRPAN(ST,PNF)
  2302.       IMPLICIT INTEGER (A-Z)
  2303.       INCLUDE 'dparam.for'
  2304.       LOGICAL PNF
  2305. C
  2306.       MIRPAN=.TRUE.
  2307.       NUM=MRHERE(HERE)                          ! get mirror num.
  2308.       IF(NUM.NE.0) GO TO 100                    ! any here?
  2309.       CALL RSPEAK(ST)                           ! no, lose.
  2310.       RETURN
  2311. C
  2312. 100   IF((PRSA.NE.MOVEW).AND.(PRSA.NE.OPENW)) GO TO 200
  2313.       CALL RSPEAK(ST+1)                         ! cant open or move.
  2314.       RETURN
  2315. C
  2316. 200   MRBF=0                                    ! assume mirror ok.
  2317.       IF(((NUM.EQ.1).AND..NOT.MR1F).OR.
  2318.      1 ((NUM.EQ.2).AND..NOT.MR2F)) MRBF=1
  2319.       IF(PNF.OR.((PRSA.NE.LOOKIW).AND.(PRSA.NE.EXAMIW).AND.
  2320.      1(PRSA.NE.LOOKW))) GO TO 300
  2321.       CALL RSPEAK(844+MRBF)                     ! look in mirror.
  2322.       RETURN
  2323. C
  2324. 300   IF(PRSA.NE.MUNGW) GO TO 400               ! break?
  2325.       CALL RSPEAK(ST+2+MRBF)                    ! do it.
  2326.       IF((NUM.EQ.1).AND..NOT.PNF) MR1F=.FALSE.
  2327.       IF((NUM.EQ.2).AND..NOT.PNF) MR2F=.FALSE.
  2328.       RETURN
  2329. C
  2330. 400   IF(PNF.OR.(MRBF.EQ.0)) GO TO 500          ! broken mirror?
  2331.       CALL RSPEAK(846)
  2332.       RETURN
  2333. C
  2334. 500   IF(PRSA.NE.PUSHW) GO TO 600               ! push?
  2335.       CALL RSPEAK(ST+3+NUM)
  2336.       RETURN
  2337. C
  2338. 600   MIRPAN=.FALSE.                            ! cant handle it.
  2339.       RETURN
  2340. C
  2341.       END
  2342.  
  2343. C BALLOP-       Balloon function
  2344. C
  2345. C Declarations
  2346. C
  2347.       LOGICAL FUNCTION BALLOP(ARG)
  2348.       IMPLICIT INTEGER (A-Z)
  2349.       INCLUDE 'dparam.for'
  2350.       LOGICAL FINDXT,QEMPTY
  2351. C
  2352.       BALLOP=.TRUE.                             ! assume wins.
  2353.       IF(ARG.NE.2) GO TO 200                    ! readout?
  2354.       IF(PRSA.NE.LOOKW) GO TO 10                ! only process look.
  2355.       IF(BINFF.NE.0) GO TO 50                   ! inflated?
  2356.       CALL RSPEAK(543)                          ! no.
  2357.       GO TO 100
  2358. 50    CALL RSPSUB(544,ODESC2(BINFF))            ! yes.
  2359. 100   IF(BTIEF.NE.0) CALL RSPEAK(545)           ! hooked?
  2360.       GO TO 10
  2361. C
  2362. 200   IF(ARG.NE.1) GO TO 500                    ! readin?
  2363.       IF(PRSA.NE.WALKW) GO TO 300               ! walk?
  2364.       IF(FINDXT(PRSO,HERE)) GO TO 250           ! valid exit?
  2365.       CALL RSPEAK(546)                          ! no, joke.
  2366.       RETURN
  2367. C
  2368. 250   IF(BTIEF.EQ.0) GO TO 275                  ! tied up?
  2369.       CALL RSPEAK(547)                          ! yes, joke.
  2370.       RETURN
  2371. C
  2372. 275   IF(XTYPE.NE.XNORM) GO TO 10               ! normal exit?
  2373.       IF((RFLAG(XROOM1).AND.RMUNG).NE.0) GO TO 10
  2374.       BLOC=XROOM1
  2375.       CFLAG(CEVBAL)=.TRUE.
  2376.       CTICK(CEVBAL)=3
  2377. 10    BALLOP=.FALSE.
  2378.       RETURN
  2379. C
  2380. 300   IF((PRSA.NE.TAKEW).OR.(PRSO.NE.BINFF)) GO TO 350
  2381.       CALL RSPSUB(548,ODESC2(BINFF))            ! recep cont too hot.
  2382.       RETURN
  2383. C
  2384. 350   IF((PRSA.NE.PUTW).OR.(PRSI.NE.RECEP).OR.QEMPTY(RECEP))
  2385.      1GO TO 10                                  ! recep already full.
  2386.       CALL RSPEAK(549)
  2387.       RETURN
  2388. C
  2389. 500   IF((PRSA.NE.BURNW).OR.(OCAN(PRSO).NE.RECEP)) GO TO 10
  2390.       CALL RSPSUB(550,ODESC2(PRSO))             ! light fire in recep.
  2391.       CFLAG(CEVBRN)=.TRUE.
  2392.       CTICK(CEVBRN)=OSIZE(PRSO)*20
  2393.       OFLAG1(PRSO)=(OFLAG1(PRSO).OR.(ONBT+FLAMBT+LITEBT)).AND.
  2394.      1.NOT.(TAKEBT+READBT)                      ! burn it.
  2395.       IF(BINFF.NE.0) RETURN                     ! already inflated?
  2396.       IF(.NOT.BLABF) CALL NEWSTA(BLABE,0,0,BALLO,0) ! insert label.
  2397.       BLABF=.TRUE.                              ! only once.
  2398.       BINFF=PRSO
  2399.       CFLAG(CEVBAL)=.TRUE.
  2400.       CTICK(CEVBAL)=3                           ! start countdown.
  2401.       CALL RSPEAK(551)
  2402.       RETURN
  2403. C
  2404.       END
  2405.  
  2406. C TROLLP-       Troll function
  2407. C
  2408. C Declarations
  2409. C
  2410.       LOGICAL FUNCTION TROLLP(ARG)
  2411.       IMPLICIT INTEGER (A-Z)
  2412.       INCLUDE 'dparam.for'
  2413.       LOGICAL QHERE,PROB
  2414. C
  2415.       TROLLP=.TRUE.                             ! assume wins.
  2416.       IF(PRSA.NE.FIGHTW) GO TO 1100             ! fight?
  2417.       IF(OCAN(AXE).EQ.TROLL) GO TO 10           ! got axe?  nothing.
  2418.       I=433                                     ! assume cant get.
  2419.       IF(.NOT.QHERE(AXE,HERE).OR.PROB(25,10)) GO TO 1050 ! here?
  2420.       I=434                                     ! yes, recover.
  2421.       CALL NEWSTA(AXE,0,0,TROLL,0)
  2422. 1050  IF(QHERE(TROLL,HERE)) CALL RSPEAK(I)      ! if player here.
  2423.       RETURN
  2424. C
  2425. 1100  IF(PRSA.NE.DEADXW) GO TO 1200             ! dead?
  2426.       TROLLF=.TRUE.                             ! permit exits.
  2427.       RETURN
  2428. C
  2429. 1200  IF(PRSA.NE.OUTXW) GO TO 1300              ! out?
  2430.       TROLLF=.TRUE.                             ! permit exits.
  2431.       OFLAG1(AXE)=OFLAG1(AXE).AND. .NOT.VISIBT
  2432.       ODESC1(TROLL)=435                         ! troll out.
  2433.       RETURN
  2434. C
  2435. 1300  IF((PRSA.NE.INXW).AND.                    ! wake from fight demon?
  2436.      1 (((PRSA.NE.ALARMW).AND.(PRSA.NE.KICKW)).OR.
  2437.      2   (OCAPAC(TROLL).GE.0))) GO TO 1400      ! wake, kick while out?
  2438.       OCAPAC(TROLL)=IABS(OCAPAC(TROLL))         ! yes, wake him.
  2439.       OFLAG1(AXE)=OFLAG1(AXE).OR.VISIBT
  2440.       TROLLF=.FALSE.                            ! forbid exits.
  2441.       ODESC1(TROLL)=436                         ! troll in.
  2442.       IF(QHERE(TROLL,HERE)) CALL RSPEAK(437)
  2443.       RETURN
  2444. C
  2445. 1400  IF(PRSA.NE.FRSTQW) GO TO 1500             ! first encounter?
  2446.       TROLLP=PROB(33,66)                        ! 33% true unless badlk.
  2447.       RETURN
  2448. C
  2449. 1500  IF((PRSA.NE.MOVEW).AND.(PRSA.NE.TAKEW).AND.(PRSA.NE.MUNGW)
  2450.      1.AND.(PRSA.NE.THROWW).AND.(PRSA.NE.GIVEW)) GO TO 2000
  2451.       IF(OCAPAC(TROLL).GE.0) GO TO 1550         ! troll out?
  2452.       OCAPAC(TROLL)=IABS(OCAPAC(TROLL))         ! yes, wake him.
  2453.       OFLAG1(AXE)=OFLAG1(AXE).OR.VISIBT
  2454.       TROLLF=.FALSE.                            ! forbid exits.
  2455.       ODESC1(TROLL)=436                         ! troll in.
  2456.       CALL RSPEAK(437)
  2457. C
  2458. 1550  IF((PRSA.NE.TAKEW).AND.(PRSA.NE.MOVEW)) GO TO 1600
  2459.       CALL RSPEAK(438)                          ! joke.
  2460.       RETURN
  2461. C
  2462. 1600  IF(PRSA.NE.MUNGW) GO TO 1700              ! mung?
  2463.       CALL RSPEAK(439)                          ! joke.
  2464.       RETURN
  2465. C
  2466. 1700  IF(PRSO.EQ.0) GO TO 10                    ! no object?
  2467.       I=440                                     ! assume throw.
  2468.       IF(PRSA.EQ.GIVEW) I=441                   ! give?
  2469.       CALL RSPSUB(I,ODESC2(PRSO))               ! troll takes.
  2470.       IF(PRSO.EQ.KNIFE) GO TO 1900              ! obj knife?
  2471.       CALL NEWSTA(PRSO,442,0,0,0)               ! no, eats it.
  2472.       RETURN
  2473. C
  2474. 1900  CALL RSPEAK(443)                          ! knife, throws it back
  2475.       OFLAG2(TROLL)=OFLAG2(TROLL).OR.FITEBT     ! and gets mad.
  2476.       RETURN
  2477. C
  2478. 2000  IF(.NOT.TROLLF.OR.(PRSA.NE.HELLOW)) GO TO 10
  2479.       CALL RSPEAK(366)                          ! troll out.
  2480.       RETURN
  2481. C
  2482. 10    TROLLP=.FALSE.                            ! couldnt handle it.
  2483.       RETURN
  2484. C
  2485.       END
  2486.  
  2487. C CYCLOP-       Cyclops function
  2488. C
  2489. C Declarations
  2490. C
  2491.       LOGICAL FUNCTION CYCLOP(ARG)
  2492.       IMPLICIT INTEGER (A-Z)
  2493.       INCLUDE 'dparam.for'
  2494. C
  2495.       CYCLOP=.TRUE.                             ! assume wins.
  2496.       IF(.NOT.CYCLOF) GO TO 100                 ! asleep?
  2497.       IF((PRSA.NE.ALARMW).AND.(PRSA.NE.MUNGW).AND.(PRSA.NE.KICKW).AND.
  2498.      1(PRSA.NE.BURNW).AND.(PRSA.NE.KILLW).AND.(PRSA.NE.ATTACW))
  2499.      2 GO TO 10
  2500.       CYCLOF=.FALSE.                            ! wake cyclops.
  2501.       CALL RSPEAK(187)                          ! describe.
  2502.       RVCYC=IABS(RVCYC)
  2503.       OFLAG2(CYCLO)=OFLAG2(CYCLO).OR.FITEBT
  2504.       RETURN
  2505. C
  2506. 100   IF(PRSA.NE.GIVEW) GO TO 500               ! give?
  2507.       IF(PRSO.NE.FOOD) GO TO 300                ! food?
  2508.       IF(RVCYC.LT.0) GO TO 200                  ! already eaten?
  2509.       CALL NEWSTA(FOOD,189,0,0,0)               ! eats peppers.
  2510.       RVCYC=MIN0(-1,-RVCYC)                     ! gets thirsty.
  2511. 200   CFLAG(CEVCYC)=.TRUE.                      ! turn on cyclops timer.
  2512.       CTICK(CEVCYC)=-1
  2513.       RETURN
  2514. C
  2515. 300   IF(PRSO.NE.WATER) GO TO 400               ! drink when thirsty?
  2516.       IF(RVCYC.GE.0) GO TO 350
  2517.       CALL NEWSTA(PRSO,190,0,0,0)               ! drinks and
  2518.       CYCLOF=.TRUE.                             ! falls asleep.
  2519.       OFLAG2(CYCLO)=OFLAG2(CYCLO).AND.(.NOT.FITEBT)
  2520.       CFLAG(CEVCYC)=.FALSE.                     ! turn off cyclops timer.
  2521.       RETURN
  2522. C
  2523. 350   CALL RSPEAK(191)                          ! not thirsty.
  2524. 10    CYCLOP=.FALSE.                            ! fails.
  2525.       RETURN
  2526. C
  2527. 400   I=192                                     ! assume inedible.
  2528.       IF(PRSO.EQ.GARLI) I=193                   ! garlic is joke.
  2529. 450   CALL RSPEAK(I)                            ! disdain it.
  2530.       RETURN
  2531. C
  2532. 500   IF((PRSA.NE.KILLW).AND.(PRSA.NE.ATTACW).AND.
  2533.      1 (PRSA.NE.MUNGW).AND.(PRSA.NE.THROWW)) GO TO 600
  2534.       CFLAG(CEVCYC)=.TRUE.                      ! turn on cyclops timer.
  2535.       CTICK(CEVCYC)=-1
  2536.       I=201                                     ! assume not poke.
  2537.       IF(PRSA.EQ.MUNGW) I=912                   ! poke joke.
  2538.       GO TO 450                                 ! go remark and return.
  2539. C
  2540. 600   I=202                                     ! assume take.
  2541.       IF(PRSA.EQ.TAKEW) GO TO 450
  2542.       I=203                                     ! assume tie.
  2543.       IF(PRSA.EQ.TIEW) GO TO 450
  2544.       CYCLOP=.FALSE.
  2545.       RETURN
  2546. C
  2547.       END
  2548.  
  2549. C THIEFP-       Thief function
  2550. C
  2551. C Declarations
  2552. C
  2553.       LOGICAL FUNCTION THIEFP(ARG)
  2554.       IMPLICIT INTEGER (A-Z)
  2555.       INCLUDE 'dparam.for'
  2556.       LOGICAL QHERE,PROB,QEMPTY
  2557. C
  2558.       THIEFP=.TRUE.                             ! assume wins.
  2559.       IF(PRSA.NE.FIGHTW) GO TO 100              ! fight?
  2560.       IF(OCAN(STILL).EQ.THIEF) GO TO 10         ! got stilletto?  f.
  2561.       IF(QHERE(STILL,THFPOS)) GO TO 50          ! can he recover it?
  2562.       CALL NEWSTA(THIEF,0,0,0,0)                ! no, vanish.
  2563.       IF(QHERE(THIEF,HERE)) CALL RSPEAK(498)    ! if hero, tell.
  2564.       RETURN
  2565. C
  2566. 50    CALL NEWSTA(STILL,0,0,THIEF,0)            ! yes, recover.
  2567.       IF(QHERE(THIEF,HERE)) CALL RSPEAK(499)    ! if hero, tell.
  2568.       RETURN
  2569. C
  2570. 100   IF(PRSA.NE.DEADXW) GO TO 200              ! dead?
  2571.       THFACT=.FALSE.                            ! disable demon.
  2572.       IF(HERE.NE.TREAS) GO TO 150               ! in treasure room?
  2573.       J=501
  2574.       DO 125 I=1,OLNT                           ! loop.
  2575.         IF((I.EQ.CHALI).OR.(I.EQ.THIEF).OR..NOT.QHERE(I,HERE))
  2576.      1GO TO 125                                 ! is it here?
  2577.         OFLAG1(I)=OFLAG1(I).OR.VISIBT           ! rematerialize objects.
  2578.         CALL RSPSUB(J,ODESC2(I))                ! describe.
  2579.         J=502
  2580.         IF(.NOT.QEMPTY(I).AND.
  2581.      1  (((OFLAG1(I).AND.TRANBT).NE.0).OR.
  2582.      2   ((OFLAG2(I).AND.OPENBT).NE.0))) CALL PRINCO(I,573,.TRUE.)
  2583. 125   CONTINUE
  2584. C
  2585. 150   J=500
  2586.       DO 175 I=1,OLNT                           ! carrying anything?
  2587.         IF(OADV(I).NE.-THIEF) GO TO 175
  2588.         CALL NEWSTA(I,0,HERE,0,0)               ! drop in room.
  2589.         CALL RSPSUB(J,ODESC2(I))                ! describe.
  2590.         J=502
  2591.         IF(.NOT.QEMPTY(I).AND.
  2592.      1  (((OFLAG1(I).AND.TRANBT).NE.0).OR.
  2593.      2   ((OFLAG2(I).AND.OPENBT).NE.0))) CALL PRINCO(I,573,.TRUE.)
  2594. 175   CONTINUE
  2595.       RETURN
  2596. C
  2597. 200   IF(PRSA.NE.FRSTQW) GO TO 250              ! first encounter?
  2598.       THIEFP=PROB(20,75)
  2599.       RETURN
  2600. C
  2601. 250   IF((PRSA.NE.HELLOW).OR.(OCAPAC(THIEF).GE.0)) GO TO 300
  2602.       CALL RSPEAK(626)                          ! hello to out thief?
  2603.       RETURN
  2604. C
  2605. 300   IF(PRSA.NE.OUTXW) GO TO 400               ! out?
  2606.       THFACT=.FALSE.                            ! disable demon.
  2607.       ODESC1(THIEF)=504                         ! change description.
  2608.       OFLAG1(STILL)=OFLAG1(STILL).AND..NOT.VISIBT
  2609.       RETURN
  2610. C
  2611. 400   IF((PRSA.NE.INXW).AND.                    ! wake from fight demon?
  2612.      1 (((PRSA.NE.ALARMW).AND.(PRSA.NE.KICKW)).OR.
  2613.      2   (OCAPAC(THIEF).GE.0))) GO TO 500       ! wake, kick while out?
  2614.       OCAPAC(THIEF)=IABS(OCAPAC(THIEF))         ! wake him up.
  2615.       IF(QHERE(THIEF,HERE)) CALL RSPEAK(505)    ! can hero see?
  2616.       THFACT=.TRUE.                             ! enable demon.
  2617.       ODESC1(THIEF)=503                         ! change description.
  2618.       OFLAG1(STILL)=OFLAG1(STILL).OR.VISIBT
  2619.       RETURN
  2620. C
  2621. 500   IF(PRSA.NE.TAKEW) GO TO 600               ! take?
  2622.       CALL RSPEAK(506)                          ! joke.
  2623.       RETURN
  2624. C
  2625. 600   IF((PRSA.NE.THROWW).OR.(PRSO.NE.KNIFE).OR.
  2626.      1((OFLAG2(THIEF).AND.FITEBT).NE.0)) GO TO 700
  2627.       IF(PROB(10,10)) GO TO 650                 ! threw knife, 10%?
  2628.       CALL RSPEAK(507)                          ! no, just makes
  2629.       OFLAG2(THIEF)=OFLAG2(THIEF).OR.FITEBT     ! thief mad.
  2630.       RETURN
  2631. C
  2632. 650   J=508                                     ! thief drops stuff.
  2633.       DO 675 I=1,OLNT
  2634.         IF(OADV(I).NE.-THIEF) GO TO 675         ! thief carrying?
  2635.         J=509
  2636.         CALL NEWSTA(I,0,HERE,0,0)
  2637. 675   CONTINUE
  2638.       CALL NEWSTA(THIEF,J,0,0,0)                ! thief vanishes.
  2639.       RETURN
  2640. C
  2641. 700   IF(((PRSA.NE.THROWW).AND.(PRSA.NE.GIVEW)).OR.(PRSO.EQ.0).OR.
  2642.      1(PRSO.EQ.THIEF)) GO TO 10                 ! throw/give to thief?
  2643.       IF(OCAPAC(THIEF).GE.0) GO TO 750
  2644.       OCAPAC(THIEF)=IABS(OCAPAC(THIEF))         ! wake him up.
  2645.       THFACT=.TRUE.                             ! enable demon.
  2646.       ODESC1(THIEF)=503                         ! change description.
  2647.       OFLAG1(STILL)=OFLAG1(STILL).OR.VISIBT
  2648.       CALL RSPEAK(510)
  2649. C
  2650. 750   IF((PRSO.NE.BRICK).OR.(OCAN(FUSE).NE.BRICK).OR.
  2651.      1(CTICK(CEVFUS).EQ.0)) GO TO 800
  2652.       CALL RSPEAK(511)                          ! thief refuses bomb.
  2653.       RETURN
  2654. C
  2655. 800   IF(PRSO.NE.WATER) GO TO 850               ! water?
  2656.       CALL NEWSTA(WATER,1081,0,0,0)             ! slips through fingers.
  2657.       RETURN
  2658. C
  2659. 850   CALL NEWSTA(PRSO,0,0,0,-THIEF)            ! thief takes gift.
  2660.       IF(OTVAL(PRSO).GT.0) GO TO 900            ! a treasure?
  2661.       CALL RSPSUB(512,ODESC2(PRSO))
  2662.       RETURN
  2663. C
  2664. 900   CALL RSPSUB(627,ODESC2(PRSO))             ! thief engrossed.
  2665.       THFENF=.TRUE.
  2666.       RETURN
  2667. C
  2668. 10    THIEFP=.FALSE.
  2669.       RETURN
  2670.       END
  2671.